2017-08-14 83 views
1

我有一個基於Hibernate 4.2和Spring Boot 1.4的應用程序。我有一個非常具體的SQL查詢,我無法用高性能的方式用HQL進行建模。爲什麼Hibernate沒有從本機查​​詢返回任何東西

log.debug("Request to get all current Bids for station : code {}, bidType {}, versionNum {}", code, bidType, grainProAdminProperties.getPrice().getCurrentVersionNumber()); 

List<Object[]> result = sessionFactory.getCurrentSession().createSQLQuery(
     "select bid.*, tp.price as tp_price, tp.price_nds as tp_priceNds " + 
     "from bid, transportation_price tp, station_location lts, partner part, station stat " + 
     "where " + 
     " bid.is_active = true and" + 
     " bid.archive_date is null and " + 
     " part.id = bid.elevator_id and " + 
     " part.station_id = stat.id and " + 
     " lts.region_id = stat.region_id and " + 
     " lts.district_id = stat.district_id and " + 
     " (stat.locality_id is null or " + 
     " lts.locality_id = stat.locality_id) and " + 
     " ((cast(tp.station_from_code as text) = lts.code and " + 
     "  cast(tp.station_to_code as text) = cast(:code as text)) " + 
     " or " + 
     " (cast(tp.station_to_code as text) = lts.code and " + 
     "  cast(tp.station_from_code as text) = cast(:code as text))) and " + 
     " cast(bid.bid_type as text) like cast(:bidType as text) and " + 
     " cast(tp.version_number as int) = cast(:versionNumber as int)"). 
     setResultTransformer(
      new ResultTransformer() { 
       @Override 
       public Object transformTuple(Object[] tuple, String[] aliases) { 
        log.warn("Transform tuple: {}, aliases {}", tuple, aliases); 
        return null; 
       } 

       @Override 
       public List transformList(List collection) { 
        return collection; 
       } 
      } 
     ). 
     setParameter("code", code). 
     setParameter("versionNumber", grainProAdminProperties.getPrice().getCurrentVersionNumber()). 
     setParameter("bidType", bidType). 
     list(); 

    log.debug("Result of request: {}", result); 

在日誌文件中我可以看到:

Request to get all current Bids for station : code 865065, bidType BUY, versionNum 2 
Hibernate: select bid.*, tp.price as tp_price, tp.price_nds as tp_priceNds from bid, transportation_price tp, station_location lts, partner part, station stat where bid.is_active = true and bid.archive_date is null and part.id = bid.elevator_id and part.station_id = stat.id and lts.region_id = stat.region_id and lts.district_id = stat.district_id and (stat.locality_id is null or lts.locality_id = stat.locality_id) and ((cast(tp.station_from_code as text) = lts.code and  cast(tp.station_to_code as text) = cast(? as text)) or  (cast(tp.station_to_code as text) = lts.code and  cast(tp.station_from_code as text) = cast(? as text))) and  cast(bid.bid_type as text) like cast(? as text) and  cast(tp.version_number as int) = cast(? as int) 
Result of request: [] 

,返回的結果爲空。我試圖直接在數據庫中使用相同的參數執行相同的請求,我得到3個結果。

您能否預測爲什麼會出現這種情況?

+1

您是否試圖在查詢中將您的3個查詢參數硬編碼爲常量以檢查它不是綁定問題? –

+0

謝謝@GaëlMarziou!你是對的。我使用Enum BidType作爲輸入參數,我認爲將調用標準的toString()方法在SQL中進行替換。但請買一些原因它不是真的:(你可以請爲我解釋這種行爲的原因嗎? –

回答

1

問題是(如@GaëlMarziou所說)在一個綁定。我使用Enum BidType作爲此查詢的輸入參數,但未使用標準toString方法將其轉換爲字符串。

+0

好,所以你在你的枚舉上使用了'name()'方法嗎?它也可能取決於你的枚舉字段如何映射到列 –

+1

我已經使用了具有默認實現'return name'的toString,Enum字段的配置是'@NotNull @Enumerated(EnumType.STRING) @Column(name =「bid_type」,nullable = false) private BidType bidType;' –

相關問題