Hibernate HQL - 如果一个属性可能为null,该怎么办

时间:2016-10-04 12:50:17

标签: mysql hibernate hql

我需要通过此查询从我的数据库中获取用户:

SELECT * FROM users
WHERE first_name = 'Aragorn'
AND last_name = 'SonOfAratorn'
AND city = 'Osgiliot'
AND country = 'Gondor'

问题是在我的应用程序中,我经常会丢失城市或国家,或者两者都丢失。

我可以为此制作3或4个HQL查询,但这似乎是一个不是非常有效的解决方案。

有没有办法只有一个查询可以容纳这些属性(城市和国家/地区)中的一个或两个为空的情况,以及如何将该查询转换为HQL?

我的数据库在MySql Server上。

PS:

我尝试了类似的东西,但它不起作用:

SELECT * FROM users
WHERE first_name = 'Aragorn'
AND last_name = 'SonOfAratorn'
AND city like IFNULL('%', <my-city-param>)
AND country like IFNULL('%', <my-country-param>);

我正在寻找类似HQL格式的东西。

提前致谢。 :)

3 个答案:

答案 0 :(得分:1)

检查合并功能;

coalesce(:valueifnotnull,'valueifnull') 

应该做的伎俩

答案 1 :(得分:1)

如果您有一个名为Users的实体,并且您并不总是传递填充的城市和国家/地区参数,并且想要忽略它们,那么这就是JPQL / HQL和Java代码:

StringBuilder jpql = new StringBuilder();

jpql.append("SELECT user FROM Users user ");
jpql.append("WHERE user.first_name = :firstname ");
jpql.append("AND user.last_name = :lastname ");

Map<String, Object> paramsQuery = new HashMap<String, Object>();

if (cityParam == null) {
    paramsQuery.put("city", "%" + cityParam+ "%");
    jpql.append("AND (city like :city) ");
}

if (countryParam == null){
    paramsQuery.put("country", "%" + countryParam+ "%");
    jpql.append("AND (country like :country) ");
}

Query q = em.createQuery(jpql.toString())
q.setParameter("firstname", firstnameParam);
q.setParameter("lastname",lastnameParam);
setQueryParameters(params, q);

在查询中设置可选参数的辅助方法:

public Query setQueryParameters(Map<String, Object> params, Query query) {
    Set<Entry<String, Object>> entrySet = params.entrySet();
    for (Entry<String, Object> entry : entrySet) {
        query.setParameter(entry.getKey(), entry.getValue());
    }

    return query;
}

答案 2 :(得分:0)

SELECT * FROM users
WHERE first_name = 'Aragorn'
AND last_name = 'SonOfAratorn'
AND (city is null or @city is null or city like '%' + @city)
AND (country is null or @country is null or country like '%' + @country)