簡體   English   中英

JPA where where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM