【问题标题】:Hibernate HQL IN clause only match first item of listHibernate HQL IN 子句仅匹配列表的第一项
【发布时间】:2013-08-20 03:54:20
【问题描述】:

问题:hql 查询的 IN 子句只匹配逗号分隔列表的第一项!

HQL 查询是这样的:from News where 93 IN (pictureIds)

新闻实体是:

public class News {
  String id;
  String pictureIds; // comma separated list of pictureIds
}

注意:如果我更改 HQL 查询并对 pictureIds 进行硬编码,其结果是正确的!

如何更改我的查询以解决问题?

【问题讨论】:

  • 您是否使用休眠模板来这样做..??
  • 我正在使用 Hibernate、Criteria 和 Criterion 来构建 HQL。

标签: hibernate hql


【解决方案1】:

试试这个:

from News where pictureIds LIKE '%,93,%'

逗号添加到开头和结尾。

【讨论】:

  • 最后我决定改变数据库结构。
  • LIKE '%93%' 不仅匹配 93,还匹配 9393 和 3493 等等。
  • 您可以在开头和结尾添加一个逗号并匹配%,93,%
  • @StefanSteinegger 如果 93 是第一个或最后一个元素会发生什么?
  • @OptimusPrime 是的,完整的应该是:pictureIds LIKE '%,93,%' OR pictureIds LIKE '93,%' OR pictureIds LIKE '%,93 OR pictureIds = '93'。旁注:我没有改变答案,我只是发表评论。 “修正”答案总是很危险的。如果不再是相同的解决方案,则应该是不同的答案或仅是评论。 注意:答案已被接受再次更改之前。
【解决方案2】:

这样就可以了。

Query query = getSession().createQuery("Select * from News where pictureIds In (:List)")  
             .setParameterList("List",ListValues);

查看here 了解 HQL 使用的基础知识。

【讨论】:

    【解决方案3】:

    我已经让它工作了,但它相当乏味:

    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,% 太强了。通过在 after 之前添加所有变体逗号并单独捕获实际字符串中可能存在的所有变体

    希望对别人有帮助

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 2020-12-31
      • 2014-09-17
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多