簡體   English   中英

使用Hibernate for Java時,HQL中的異常行為綁定parameterList

[英]When using Hibernate for Java getting abnormal behavior binding parameterList in HQL

更新我發現了問題。 有點尷尬。 客戶端代碼正在發送Set 1元素,該元素是報表ID的串聯字符串。 啊!


我在Java項目中使用的是Hibernate v3.6.4。 嘗試在HQL查詢中為命名參數使用參數列表時遇到問題。

基本上,我想獲取與IN子句中提到的“ id ”之一匹配的所有記錄。

我嘗試同時使用HQL和條件我得到了相同的結果。

我的HQL查詢

Set<String> reportIds = new HashSet<String>();
reportIds.add("1");
reportIds.add("2");

String whereClause = "from Report where id IN (:reportIds) ";
Query query = session.createQuery(whereClause);
query.setParameterList("reportIds", reportIds);

輸出=空列表。 盡管我通過在終端中觸發手動sql查詢來檢查確實存在此類記錄。

我打開了日志記錄,這就是我所看到的,

Hibernate: 
    /* 
from
    Report 
where
    id IN (
        :ids
    ) */ select
        mediavalue0_.id as id31_,
        ...

    from
        report mediavalue0_ 
    where
        mediavalue0_.id in (
            ?
        )
HibernateLog --> 13:22:36 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 1,2

這是非常不正常的,因為如果您注意到最終的bind語句,它將考慮Set的toString! 即“ 1,2”,而不是“ 1”,然后是“ 2”!

我搞砸了,所以一時興起,我決定直接在setParameterList方法調用本身內部創建該set的實例。 像這樣

query.setParameterList("reportIds", Sets.newHashSet("1","2"));

而且有效! BTW Sets.newHashSet是Google的番石榴庫提供的結構。 我使用相同的庫來生成原始的reportIds集。 因此,那里沒有任何不一致之處。

該查詢翻譯為以下TRACE,

from
    Report 
where
    id IN (
        :ids
    ) */ select
        mediavalue0_.id as id31_,
        ...
    from
        report mediavalue0_ 
    where
        mediavalue0_.id in (
            ? , ?
        )
HibernateLog --> 13:28:57 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 1
HibernateLog --> 13:28:57 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - 2

注意VARCHAR的單獨綁定。

我完全被這種奇怪的行為弄糊塗了。 也許有些人可以指出我做錯了什么。

僅供參考,我使用的條件構造(&導致相同的輸出)就像這樣,

Criteria criteria = session.createCriteria(Report.class);
criteria.add(Restrictions.in("id", reportIds));

PS我也使用了具有相同結果的命名的sql查詢

<sql-query name="reportByIds">
    <return class="report.Report"/>
    SELECT mvr.* from report mvr
    WHERE mvr.id IN :ids
</sql-query>  

假設id屬性的類型為Long

Set<Long> reportIds = new HashSet<Long>();
reportIds.add(1l);
reportIds.add(2l);

則查詢應該有效,條件也有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM