2017-03-07 70 views
0

小伙,我有一个很奇怪的问题。createQuery不起作用,但createNativeQuery的作品

我设立在我的应用程序的一些端点和我有一个端点这样的:

@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(); 
    } 
} 

的想法是,我需要从表中获取的所有信息“IO配置”,我有32排在一个名为“IO_CONFIGURATION”表,该实体POJO是这样的:

@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; 
    ... 
} 

这里是我如何插入行:

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(); 
    } 

我可以看到从cqlsh控制台插入到我的数据库中的行。

我为我的DAO编写的所有服务,比如插入,删除,修改,完美工作,所以我认为wildfly和我的cassandra数据库之间的连接没有问题。

但是,如果我使用HQL,查询不会像预期的那样工作。

对于我上面提到的端点,这是我想调用的方法:

@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(); 
     } 

如果我使用createNativeQuery像第一行,终点将工作完美,这是结果我从resteasy得到:

但是,如果我使用createQuery像第二行一样,端点将无法工作,并给我一个空的列表。

这里是我参考的persistence.xml:

<?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> 

我不知道是什么原因。这很奇怪,有人可以向我解释这一点吗?

感谢

编辑:

我不能到我的屏幕截图的一些数据库连接测试结果上传由于一些计算器点问题。以下是我可以分享有关数据库的一些可用资源。 我正在使用cassandra,所以我正在使用名为'dev'的密钥空间来存储我的所有表。 这里是我从类型后终端 “描述dev的” 得到的结果:

创建复制KEYSPACE dev的= { '类': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes =真;

CREATE TABLE dev。“DATA_SERIES_META”( “DATA_SERIES_META_ID” 文本PRIMARY KEY, “B_INFO” 双, “CHANNEL_NAME” 的文字, “CONVERTION_TYPE” 文本, “IO_CONFIGURATION” 文本, “LAST_SAMPLE_TIME” 文本, “M_INFO” 双, “ NAME”文本, “SAMPEL_PERIOD” INT, “SAMPLE_RANGE” 文本, “START_TIME” 文本, “STORE_CONVERTED” 布尔值, “STORE_ROW” 布尔值, “TOTAL_SAMPLE” BIGINT, “VOLTAGE_DIVIDE” 文本)WITH bloom_filter_fp_chance = 0.01 AND caching = {'keys':'ALL','rows_per_partition':'NONE'} AND comment ='' AND compaction = {'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold':'32','min_threshold':'4'} AND compression = { 'chunk_length_in_kb': '64', '类': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND = gc_grace_seconds 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry ='99PERCENTILE'; CREATE INDEX DATA_SERIES_META_IO_CONFIGURATION ON dev。“DATA_SERIES_META” (“IO_CONFIGURATION”);

CREATE TABLE dev的。 “NODE_DATA”( “NODEDATA_ID” 文本PRIMARY KEY, “IO_CONFIGURATION” 文本, “TIME” BIGINT, “VALUE” 双)WITH bloom_filter_fp_chance = 0.01 和缓存= {'键的:'ALL','rows_per_partition':'NONE'} AND comment ='' AND compaction = {'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold':'32' ,'min_threshold':'4'} AND compression = {'chunk_length_in_kb':'64','class':'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND dclocal_ read_repair_chance = 0.1 AND default_time_to_live = 0 AND = gc_grace_seconds 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99PERCENTILE'; CREATE INDEX NODE_DATA_IO_CONFIGURATION ON dev。“NODE_DATA”(“IO_CONFIGURATION”);

CREATE TABLE开发。 “IO_CONFIGURATION”( “IO_CONFIGURATION_ID” 文本PRIMARY KEY, “ACTIVE” 布尔, “B_INFO” 双, “CHANNEL_NAME” 的文字, “CODE” 文本, “CONVERSION_TYPE” 的文字, “DEFAULT_GRAPH” 文本, “M_INFO” 双, “NAME” 的文字, “RANGE_LOWERBOUND” INT, “RANGE_UPPERBOUND” INT, “SAMPLE_PERIOD” INT, “SAMPLE_RANGE” 文本, “STORE_CONVERTED” 布尔, “ STORE_ROW“布尔值, “TITLE”文本, “UNIT”文本, “VOLTAGE_DIVIDE”文本)WITH bloom_filter_fp_chance = 0。01 AND caching = {'keys':'ALL','rows_per_partition':'NONE'} AND comment ='' AND compaction = {'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' , 'max_threshold':'32','min_threshold':'4'} AND compression = {'chunk_length_in_kb':'64','class':'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND = gc_grace_seconds 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry ='99PERCENTILE'; CREATE INDEX IO_CONFIGURATION_CHANNEL_NAME ON dev。“IO_CONFIGURATION” (“CHANNEL_NAME”);

CREATE TABLE dev的 “ALERT”( “ALERT_ID” 文本PRIMARY KEY, “IO_CONFIGURATION” 文本, “经营者” 的文字, “VALUE” 双)WITH bloom_filter_fp_chance = 0.01 和缓存= {'键的:'ALL','rows_per_partition':'NONE'} AND comment ='' AND compaction = {'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold':'32' ,'min_threshold':'4'} AND compression = {'chunk_length_in_kb':'64','class':'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND dclocal_read_ repair_chance = 0.1 AND default_time_to_live = 0 AND = gc_grace_seconds 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99PERCENTILE'; CREATE INDEX ALERT_IO_CONFIGURATION ON dev。“ALERT”(“IO_CONFIGURATION”);

所以可能的问题不是我有一个重复的表。

这里是我如何插入行“IO_CONFIGURATION”表的代码:

public IOConfiguration createIOConfiguration(Integer i) { 
    if (i <= 0) { 
     throw new IllegalArgumentException(
      "Invalid configuration channel found when trying to create IO configuration"); 
    } else if (i.equals(null)) { 
     throw new NullPointerException(
      "Configuration channel is null when trying to create IO configuration"); 
    } 
    IOConfiguration emp = new IOConfiguration(); 
    emp.setChannelName(ChannelName.fromInt(i)); 
    this.getManager().persist(emp); 
    return emp; 
    } 

我不能分享结果的屏幕截图,但我相信,调用此函数后,我可以插入一行放入“IO_CONFIGURATION”表中。

我现在只是使用createNativeQuery来完成这个项目。可以只选择一行,因为我可以在查询之后指定pojo类类型,并且它工作得很完美。

但使用此本机查询时,从表中选择数据列表令人沮丧。我必须手动把对象类型到我的POJO,因为当我查询后指定一个POJO类,如:

Query query = ioConfigurationDAO.getManager() 
     .createNativeQuery("select * from \"IO_CONFIGURATION\"", IOConfiguration.class); 

它只会给我的第一行中的数据库,我不知道是怎么回事上。

如果你们需要更多信息,我愿意尽我所能提供。

谢谢!

+0

你并没有真正展示你的DAO是如何创建和插入行的,所以我们只能猜测那里发生了什么。显示为查询生成的SQL,并检查数据库表,看看是否有两个IO_CONFIGURATION表。原生查询将表名称放在引号中,而在实体中,您只需将其作为IO_CONFIGURATION,以便它们可以作为与数据库不同的表显示。 – Chris

+0

嗨,克里斯,我刚刚编辑了这个问题,谢谢! – LebroNan

回答

0

要使用Cassandra和Hibernate OGM执行查询,您目前需要Hibernate Search。

文档的这一段应该给你所有的细节: https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/index.html#ogm-query-using-hibernate-search

总之,你需要添加注释org.hibernate.search.annotations.Index的实体类和org.hibernate.search.annotations.Field你要搜索的列。

编辑:没有意识到你已经在使用Hibernate Search,我会扩展答案。

这意味着它只会找到索引的实体。如果你的数据库已经包含了一些实体,你可以在找到它们之前将它们编入索引。

你开始你需要运行类似的应用程序中的第一次:

FullTextSession session = Search.getFullTextSession(openSession()); 
    session.createIndexer(IOConfiguration.class).startAndWait(); 

这将确保添加的现有实体在索引中。请查阅Hibernate Search文档以获得关于using the mass indexer的更多详细信息。

您只需要在重新创建/刷新索引时执行此操作,当您使用Hibernate OGM执行CRUD操作时,索引会自动更新。

相关问题