【问题标题】:get all the values in where clause for empty stirng using hibernate使用休眠获取空字符串的where子句中的所有值
【发布时间】:2014-03-31 11:09:36
【问题描述】:

我正在使用 jsp 和 hibernate 构建一个购物车。

我正在使用复选框按品牌大小和价格过滤内容 选中的复选框返回到 hql 查询所在的类。 所以我想要一个可以处理这个的 hql 查询。

就像如果一个参数像 size 是空的(意味着用户不使用它来过滤内容)而不是一个空字符串被传递给返回任何值的 hql 查询......

除了为不同的参数编码不同的方法之外,是否有可能在 where 子句中为空字符串或其他替代方法检索所有值...

【问题讨论】:

  • 是的。您可以编写另一个没有约束的查询。
  • 什么是“品牌尺寸”,或者您的意思是“品牌、尺寸和价格”?

标签: java sql hibernate


【解决方案1】:

首先,良好的实践表明,不应将空字符串传递给查询,而应传递 null。也就是说,这个 hql 应该可以帮助你:

from Product p 
where p.brand = coalesce(:brand, p.brand) 
and p.size = coalesce(:size, p.size) 
and p.price = coalesce (:price, p.price)

【讨论】:

  • 当 :brand 为空时如何获取 p.brand 中的所有值??
  • coalesce 函数作为三元函数工作,将第一个参数与 null 进行比较。所以,这相当于:brand = null ? p.brand : :brand。因此,如果 :brand 为 null,p.brand 将与自身进行比较并始终返回 true。
  • 它给出了空指针异常,因为我使用数组并且我必须使用 setparameterlist("size",size) ...
【解决方案2】:

我通常将 Criteria api 用于此类事情...如果用户未指定大小,请不要将其添加到条件查询中。

Criteria criteria = session.createCriteria(MyClass.class);
if(size != null && !size.isEmpty()){
     criteria.add(Restrictions.eq("size", size);
}

要通过 OR 语句进行多个限制,请使用 Disjunction。对于 AND,您使用连词。

Criteria criteria = session.createCriteria(MyClass.class);
Disjunction sizeDisjunction = Restrictions.disjunction();

String[] sizes = { "small", "medium", "large" };
for(int i = 0; i < sizes.length; i++){
   sizeDisjunction.add(Restrictions.eq("size", sizes[i]);
}
criteria.add(sizeDisjunction );

【讨论】:

  • 如何在其中使用数组或大小的多个值?
  • 用多个尺寸值的示例更新了答案。
  • 我在 In 中使用了 restricted 并且效果很好.. 无论如何,非常感谢您提供标准的想法
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2011-05-21
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多