问题:hql 查询的 IN 子句仅匹配逗号分隔列表的第一项!
HQL 查询是这样的:from News where 93 IN (pictureIds)
新闻实体是:
public class News {
String id;
String pictureIds; // comma separated list of pictureIds
}
注意:如果我更改 HQL 查询并对 pictureIds 进行硬编码,其结果是正确的!
如何更改查询以解决问题?
尝试这个:
from News where pictureIds LIKE '%,93,%'
逗号添加到开头和结尾。
这会做。
Query query = getSession().createQuery("Select * from News where pictureIds In (:List)")
.setParameterList("List",ListValues);
在这里查看HQL 使用的基础知识。
我已经让它工作了,但它相当乏味:
results?.eachWithIndex { output, i->
if (i>0) {
sb.append(" or ")
}
sb.append(" ((dbres.Field like (:myVariablesA${i})) or (dbres.Field like (:myVariablesB${i})) or (dbres.Field like (:myVariablesC${i})) or dbres.Field=:myVariable${i})")
//capture within csv so aa,val,bb
myParams."myVariablesA${i}"='%,'+output+',%'
//capture as last element: aa,val
myParams."myVariablesB${i}"='%,'+output
//capture it as first element val,aa
myParams."myVariablesC${i}"=output+',%'
//finally capture it if its not a csv and its a physical set value
myParams."myVariable${i}"=output
}
这是 groovy 并附加到 StringBuilder (sb) 元素。简而言之,csv 字符串字段本身的 %,id,% 太强了。通过在之前添加所有变体逗号,然后单独捕获实际字符串中可能存在的所有变体
希望它可以帮助别人