Hibernate命名查询不包括空值

时间:2011-03-05 14:43:02

标签: java hibernate

我正在使用以下命名查询来根据我从JSP页面传递的参数从数据库中获取结果。

<query name="getData"><![CDATA[
select
    a.name,a.desc,a.reportname,b.manname,b.mandata
from
    product as a inner join
    a.manufacturer as m
where
    m.name like :manufacturer and
    a.description like :description and
    ((a.percentSize <= :sizeMax and
    a.percentSize >= :sizeMin) or
    a.percentSize is null) and
    ((a.wingSpanInches <= :spanMax and
    a.wingSpanInches >= :spanMin) or
    a.wingSpanInches is null) and
    ((a.recommendedAuwMinLbs <= :auwMax and
    a.recommendedAuwMaxLbs >= :auwMin) or
    a.recommendedAuwMaxLbs is null)
]]></query>

并非所有搜索参数都是必需的(我获得的某些值为null)。如果参数为空,如何排除参数?

4 个答案:

答案 0 :(得分:1)

您可以使用findByExample() 如果对象具有空值字段,则它不包含在生成的SQL的where子句中。

但是,这意味着您无法使用命名查询。

答案 1 :(得分:0)

你不能这样做。您必须动态构建查询(使用StringBuilder)。

if (firName != null) {
    sb.append(" WHERE ....");
}

session.createQuery(sb.toString());

答案 2 :(得分:0)

你真的不应该直接从JSP页面进行查询。哎哟。

你必须设置每个参数(至少,你使用PostgreSQL),但可以将它们设置为null。如果它们为null,那么您已经拥有的查询将做正确的事情,而不应用相应的测试。

因此,您只需确保传递所有参数,如果未指定任何可选的参数,则将其设置为null。

答案 3 :(得分:0)

如果你添加一个额外的变量,例如。 :活性 那么你的查询应该是这样的。

...
where
(m.name like :manufacturer and 1 = :active) or
(m.name like :manufacturer and a.description like :description  and 2 = :active) or
(m.name like :manufacturer and a.description like :description and a.percentSize <= :sizeMax and 3 = :active) or ...

依旧...... 使用:active,您可以稍后决定哪些参数应该“计数”。 或者通过设置:active to eg null来执行任何操作。

你明白了吗?