2011-09-26 68 views
0

假設我有一個名爲MyData且帶有主標識符字段(稱爲「primaryID」的BigDecimal類型)的JPA註釋類,以及兩個稱爲「 fieldA「和」fieldB「。我想要做的是創建一個JPA查詢,將爲給定的MyData實例選擇fieldA AND fieldBJPQL查詢:選擇一個布爾值,它是兩個對象字段的AND

 final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     final CriteriaQuery<Boolean> boolQuery = builder.createQuery(Boolean.class); 
     final Root<MyData> data = boolQuery.from(MyData.class); 
     boolQuery.select(builder.isTrue(builder.and(data.<Boolean> get("fieldA"), 
       profile.<Boolean> get("fieldB")))); 
     final Predicate primaryIDPredicate = builder.equal(profile.<BigDecimal> get("primaryID"), 
       1000); 
     boolQuery.where(primaryIDPredicate); 

     final TypedQuery<Boolean> myQuery = entityManager.createQuery(boolQuery); 

當我entityManager執行此查詢,我得到:org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: and near line 1...。這使我相信,我需要一些不同的方法(除了builder.isTrue方法)來指定我想要取對象的布爾值和兩個字段。關於如何構建此查詢的任何想法?

+0

爲什麼標題顯示「JPQL」,如果有問題,您說您需要構建JPA查詢? – jFrenetic

+0

我明白「JPQL」是指「使用JPA查詢語言」。無論這意味着創建一個JPA字符串查詢(是否參數化),還是使用CriteriaBuilder/CriteriaQuery,我都不在乎。如果我使用的術語中存在錯誤,我會更新問題。 –

+0

對不起,我自己犯了一個錯字。實際上有兩種在JPA中構建查詢的主要方法:1)** JPQL **。例如:'SELECT a,b FROM C' 2)類型安全的** Criteria查詢API **。你在你的例子中使用後者。 – jFrenetic

回答

0

好的,我最終做的只是簡單地將我想要的「布爾」移動到謂詞中,然後檢查是否返回了任何內容。當然,我可以簡單地根據主ID檢索整個對象(MyData),並在Java代碼中完成「AND」,但重點是避免獲取完整對象,因爲它有大量的嵌套連接其引用的集合,這些對於這種情況是不必要的。

 final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     final CriteriaQuery<BigInteger> primaryIDQuery = builder.createQuery(BigInteger.class); 
     final Root<MyData> data = primaryIDQuery.from(MyData.class); 
     primaryIDQuery.select(data.<BigInteger> get("primaryId")); 
     final Predicate primaryIDPredicate = builder.equal(profile.<BigInteger> get("primaryId"),1000); 
     final Predicate otherPredicate = builder.or(
       builder.isTrue(profile.<Boolean> get("fieldA")), 
       builder.isTrue(profile.<Boolean> get("fieldB"))); 
     primaryIDQuery.where(primaryIDPredicate , otherPredicate); 

     final TypedQuery<BigInteger> existenceQuery = entityManager.createQuery(primaryIDQuery); 

     boolean whatIWant = existenceQuery.getResultList().size() > 0; 
相關問題