我正在使用以下命名查询来根据我从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)。如果参数为空,如何排除参数?
答案 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来执行任何操作。
你明白了吗?