[英]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.