我需要通过此查询从我的数据库中获取用户:
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格式的东西。
提前致谢。 :)
答案 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)