2010-03-13 70 views
12

我是JPA的新手。JPA where clause任何

在JPA,查詢:

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("category", category); 

我怎樣才能設置類別在JPA任何類別?所以如果空類別通過,我簡單地忽略類別參數,選擇所有產品。

回答

0

SELECT * FROM產品類別爲*

我想你是新的SQL,太。

WHERE CATEGORY = *並不意味着「任何類別」(它甚至不是有效的SQL)。

在SQL和JPA中,如果您想要任何類別(或者在SQL中可以使用WHERE CATEGORY IS NOT NULL),則根本就沒有WHERE子句。

+0

抱歉錯誤的SQL查詢:) 您的解決方案「WHERE CATEGORY不是NULL」很好,但我必須創建另一個查詢。 有沒有其他方法可以保存一個查詢? –

15

如何將類別設置爲JPA中的任何類別?所以如果空類別通過,我簡單地忽略類別參數,選擇所有產品。

您必須在此處動態構建查詢。隨着HQL(這是一個簡化的例子):

Map<String, Object> params = new HashMap<String, Object>(); 
StringBuffer hql = new StringBuffer("from Product p"); 
boolean first = true; 

if (category != null) { 
    hql.append(first ? " where " : " and "); 
    hql.append("p.category = :category"); 
    params.put("category", category); 
} 

// And so on... 

Query query = session.createQuery(hql.toString()); 

Iterator<String> iter = params.keySet().iterator(); 
while (iter.hasNext()) { 
    String name = iter.next(); 
    Object value = params.get(name); 
    query.setParameter(name, value); 
} 

List results = query.list() 

但是,實際上,我的建議是在這裏使用Criteria API:

Criteria criteria = session.createCriteria(Product.class); 
if (category != null) { 
    criteria.add(Expression.eq("category", category); 
} 
// And so on... 
List results = criteria.list(); 

複雜的動態查詢簡單得多。

+0

標準是動態查詢的更好解決方案。 Expression.eq已被棄用,相反,您可以使用Restrictions.eq – Gere

4

要歸檔參數成爲可選的,你可以編寫一個查詢,而無需使用Criteria API:

select o from Product o WHERE :value is null or :value='' or o.category = :value 
+0

您好,我想知道是否可以使用此類帖子http:// stackoverflow中的查詢進行此類評估。COM /問題/ 570229 /休眠 - HQL查詢,如何對設置一個收集作爲一種名爲參數對的一查詢。所以這個查詢不能在我的項目中工作,如下所示:FROM Foo WHERE id =:id AND(:barlist爲null或Bar in(:barlist)) –

1

我怎樣才能設置類別在JPA任何類別?所以如果空分類 通過,我簡單地忽略分類參數,選擇所有產品。

您可以將類別設置爲「%」。 if(category == null)query.setParameter(「category」,「%」); else query.setParameter(「category」,category);

1

你是對的,幾乎沒有什麼變化。

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("value", category); 
在setParamater

「價值」(具體文本)應與「:值」 查詢