0 Replies Latest reply on Mar 7, 2017 4:11 PM by sensorhound-nan

    createQuery not working but createNativeQuery works

    sensorhound-nan

      Hi, guy, I have a very strange problem.

       

      I am setting up some endpoints in my application and I have an endpoints like this:

      @Path("/ioconfiguration")
      public class IOConfigurationEndPoint {
        @EJB
        private static IOConfigurationDAO ioConfigurationDAO;
        
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Response getAllIoConfigurations() {
          ioConfigurationDAO = new IOConfigurationDAO();
          ioConfigurationDAO.init();
          List<IOConfiguration> list = ioConfigurationDAO.findAllIOConfiguration();
          ioConfigurationDAO.destroy();
          return Response.status(Response.Status.OK).entity(list).build();
        }
      }
      

      The idea is that I need to get all the information "IO Configuration" from the table, and I have 32 rows in a table called "IO_CONFIGURATION", the pojo for this entity is like this:

      @Entity
      @Indexed
      @Table(name = "IO_CONFIGURATION",
          indexes = {@Index(columnList = "CHANNEL_NAME", name = "CHANNEL_NAME")})
      public class IOConfiguration implements Serializable {
      
        private static final long serialVersionUID = 7542743172221933818L;
        @Id
        @GenericGenerator(name = "IOConfiguration", strategy = "uuid")
        @GeneratedValue(generator = "IOConfiguration")
        @Column(name = "IO_CONFIGURATION_ID")
        private String ioConfigurationId;
      
        @Field(analyze = Analyze.NO)
        @Column(name = "CHANNEL_NAME")
        private String channelName;
      
        @Column(name = "NAME")
        private String name;
      
        @Column(name = "CONVERTION_TYPE")
        private String conversionType;
      
        @Column(name = "M_INFO")
        private Double mInfo;
      
        @Column(name = "B_INFO")
        private Double bInfo;
      
        @Column(name = "VOLTAGE_DIVIDE")
        private String voltageDivide;
      
        @Column(name = "SAMPLE_RANGE")
        private String sampleRange;
      
        @Column(name = "SAMPEL_PERIOD")
        private Integer samplePeriod;
      
        @Column(name = "STORE_ROW")
        private Boolean storeRow;
      
        @Column(name = "STORE_CONVERTED")
        private Boolean storeConverted;
      
        @Column(name = "DEFAULT_GRAPH")
        private String defaultGraph;
      
        @Column(name = "TITLE")
        private String title;
      
        @Column(name = "UNITS")
        private String units;
      
        @Column(name = "RANGE_LOWERBOUND")
        private Integer rangeLowerbound;
      
        @Column(name = "RANGE_UPPERBOUND")
        private Integer rangeUpperbound;
      
        @OneToMany(mappedBy = "ioConfiguration", fetch = FetchType.EAGER)
        private List<Alert> alerts;
      
        @OneToMany(mappedBy = "ioConfiguration", fetch = FetchType.EAGER)
        private List<DataSeriesMeta> dataSeriesMeta;
      
        @OneToMany(mappedBy = "ioConfiguration", fetch = FetchType.LAZY)
        private List<NodeData> nodeData;
      
        @Column(name = "CODE")
        private String code;
      
        @Column(name = "ACTIVE")
        private Boolean active;
        ...
      }
      

      And here is how I insert the rows:

      private void init() {
          ioConfigurationDAO = new IOConfigurationDAO();
          ioConfigurationDAO.init();
          property = new AigatewayProperty();
      
          for (int i = 1; i <= property.MAX_PORT_NUM; ++i) {
            ioConfigurationDAO.getManager().getTransaction().begin();
            ioConfigurationDAO.createIOConfiguration(i);
            ioConfigurationDAO.getManager().getTransaction().commit();
          }
          List<IOConfiguration> list = ioConfigurationDAO.findAllIOConfiguration();
          System.out.println(list);
          ioConfigurationDAO.destroy();
        }
      

      And this is part of the table on my cqlsh console:

      It is very clear my data has been inserted into the database.

      All services I have written for my DAO, like insert, delete, modify, work perfect, so I suppose there is no problem with the connection between wildfly and my cassandra database.

      But queries don't work as they are expected if I am using HQL.

      For the endpoint I mentioned above, this is the method I am trying to call:

      @SuppressWarnings("unchecked")
        public List<IOConfiguration> findAllIOConfiguration() {
          Query query = this.getManager().createNativeQuery("select * from \"IO_CONFIGURATION\"");
          // Query query = this.getManager().createQuery("from IOConfiguration");
          return query.getResultList();
        }
      

      If I use createNativeQuery like the first line, the endpoint will work perfect, and this is the result I get from resteasy:

      But if I use the createQuery like the second line, the endpoint will not work and give me an empty list.

      Here is my persistence.xml for reference:

      <?xml version="1.0"?>
      <persistence xmlns="http://java.sun.com/xml/ns/persistence"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
                   version="2.0">
          <persistence-unit name="JPAService">
              <!-- Use the Hibernate OGM provider: configuration will be transparent -->
              <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
              <class>com.sensorhound.aigateway.domain.Alert</class>
              <class>com.sensorhound.aigateway.domain.DataSeriesMeta</class>
              <class>com.sensorhound.aigateway.domain.IOConfiguration</class>
              <class>com.sensorhound.aigateway.domain.NodeData</class>
              <properties>
                  <property name="hibernate.transaction.jta.platform" value="JBossAS" />
                  <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.0" />
                  <property name="hibernate.ogm.datastore.provider" value="cassandra_experimental"/>
                  <property name="hibernate.ogm.datastore.host" value="127.0.0.1:9042"/>
                  <property name="hibernate.ogm.datastore.database" value="dev"/>
              </properties>
          </persistence-unit>
      </persistence>
      

      I don't know what's the reason. It's very strange, can someone explain this to me?

       

      Thanks