[英]JPA where clause any
在JPA中,查詢是:
Query q = entityManager.createQuery("select o from Product o WHERE o.category = :value");
q.setParameter("category", category);
如何在JPA中將類別設置為任何類別? 因此,如果傳遞null類,我簡單地忽略category參數,選擇所有產品。
如何在JPA中將類別設置為任何類別? 因此,如果傳遞null類,我簡單地忽略category參數,選擇所有產品。
您必須在此動態構建查詢。 使用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();
復雜的動態查詢更簡單。
要歸檔參數變為可選,您可以編寫查詢而無需使用Criteria API:
select o from Product o WHERE :value is null or :value='' or o.category = :value
你幾乎是小改變。
Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value");
query.setParameter("value", category);
在setParamater中, “value” (確切文本)應與查詢中的“:value”匹配。
如何在JPA中將類別設置為任何類別? 因此,如果傳遞null類,我簡單地忽略category參數,選擇所有產品。
您可以將類別設置為“%”。 if(category == null)query.setParameter(“category”,“%”); else query.setParameter(“category”,category);
SELECT * FROM PRODUCT WHERE CATEGORY = *
我認為你也是SQL新手。
WHERE CATEGORY = *
並不意味着“任何類別”(它甚至不是有效的SQL)。
在SQL和JPA中,如果你想要任何類別(或者在SQL中你可以擁有WHERE CATEGORY IS NOT NULL
),你根本就沒有WHERE
子句。
Pascal Thivent給出了很好的答案,推薦使用Criteria
。 然而,他的答案中的Criteria
是純粹的Hibernate
標准。 使用JPA Criteria
示例:
private List<Result> getProduct(String category) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Product> criteria = builder.createQuery(Product.class);
Root<Product> productRoot = criteria.from(Product.class);
if (category != null)
criteria.where(builder.equal(productRoot.get("category"), category))
}
entityManager.createQuery(criteria).getResultList();
}
你試圖實現的東西在設計模式方面是反直覺的。 讓我們想一想SQL術語中忽略所有JPA和其他問題的問題。
您的JPQL的相應SQL查詢如下所示
SELECT o.* FROM product o WHERE o.category = 'SOME_CAT';
現在,如果您傳遞null而不是類別SOME_CAT
那么SQL就像
SELECT o.* FROM product o WHERE o.category IS NULL;
除非您的SQL看起來如下,否則沒有SQL標准來反轉結果集更改參數值
SELECT o.* FROM product o WHERE o.category IS NOT NULL;
類似的JPQL看起來像
SELECT o FROM Product o WHERE o.category <> :param
您可以看到我們需要反轉邏輯操作而不是操縱參數。 除非使用if else條件動態構建JPQL,否則沒有標准方法可以實現此行為。
我更喜歡一個單獨的方法處理程序,一個用於過濾類別,另一個用於列出所有類別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.