2017-03-07 68 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操作時,索引會自動更新。

相關問題