2016-10-04 71 views
1

我需要從我的數據庫中獲取的用戶,此查詢:Hibernate的HQL - 做什麼,如果一個屬性可能爲空

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

的問題是,在我的應用程序,我會經常有城市或國家缺少,或者兩者都缺失。

我可以做3個或四個爲HQL查詢,但是這似乎是一個不很有效的解決方案。

有沒有辦法只有一個查詢,將容納情況下,當這些屬性(國家和城市)的一個或兩個是空的,如何轉換該查詢HQL?

我的DB是MySQL服務器上。

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

我更喜歡Criteria而不是HQL。如果你想我可以給通過標準溶液)) –

回答

1

檢查COALESCE功能;

coalesce(:valueifnotnull,'valueifnull') 

應該做的伎倆

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) 
+0

'和'比'或'更高的優先級,讓你的查詢將返回匹配的城市或國家,而不是關心在這種情況下FIRST_NAME和姓氏的所有用戶。另外我認爲OP想要檢查參數是否爲空,而不是條目的表字段。 – coladict

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; 
} 
+1

我想他意味着傳遞給查詢的參數是空的,而不是數據庫中的那個。 – coladict

相關問題