2014-03-05 26 views
0

我是JPA CriteriaBuilder的新手,並且遇到泛型錯誤,我似乎無法看到JPA Criteria Queries理解或工作我的方式。我想下面的查詢翻譯成標準的查詢在Spring數據倉庫的使用方法:JPA CriteriaBuilder泛型錯誤:CriteriaQuery <capture#2 of?>不適用於參數(表達式<Long>)

select * from User where id = (select max(id) from User); 

我試着做下面根據我在https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria看到代碼,但它給編譯時錯誤:

new Specification<User>() { 

      @Override 
      public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
       root = query.from(User.class); 
       cb.greatest(root.<Long>get("id")) 
       query.select(cb.max(root.<Long>get("id"))); 
       // TODO Auto-generated method stub 
       return null; 
      } 
     }); 

當然,我只是意識到,一旦我弄清楚如何指定查詢,我甚至不知道如何將其轉換成一個謂語無論是。

我完全脫離了這裏嗎?如何將上面的SQL轉換爲我可以使用的Predicate?

回答

1

骯髒的解決方法的時刻:

public static User getGreatestId(EntityManager em){ 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<User> cq = cb.createQuery(User.class); 
    Root<User> userRoot = cq.from(User.class); 
    Path<Long> pathToId = userRoot.get("id"); 
    cq.select(userRoot).orderBy(cb.desc(pathToId)); 
    TypedQuery<User> typed = em.createQuery(cq); 
    typed.setMaxResults(1); 
    return typed.getSingleResult(); 
} 

隨着子查詢:

public static User getGreatestId(EntityManager em){ 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<User> cq = cb.createQuery(User.class);  
    Root<User> userRoot = cq.from(User.class); 
    Path<Long> pathToId = userRoot.get("id");  
    Subquery<Long> subquery = cq.subquery(Long.class); 
    Root<User> subRoot = subquery.from(User.class); 
    Path<Long> subPathToId = subRoot.get("id");    
    subquery.select(cb.max(subPathToId));  
    cq.select(userRoot).where(cb.equal(pathToId, subquery)); 
    TypedQuery<User> typed = em.createQuery(cq);  
    return typed.getSingleResult(); 
} 
+0

我嘗試一些非常相似('謂詞p = cb.equal(root.get( 「ID」),CB最大(根。獲得(「id」)))'),但我得到的錯誤:集合函數「MAX(USER1_.ID)」 –

+0

我無法使用編輯解決方法,這給你的用戶最高的ID背部。但我認爲,這不是最好的解決方案,並不等同於給定的查詢。但它的工作;) – pL4Gu33

+0

謝謝。我也曾經剽竊過同樣的東西。 :)但希望有一個更好的方式來使用cb.max()或cb.greatest() –

相關問題