2013-02-04 47 views
1

花了大約2小時試圖瞭解爲什麼JPQL查詢不會返回我所期望的。請考慮代碼:JPQL - 在一對多中加入許多計數

System.out.println("JPQL ----------------------------"); 
    Query q = em.createQuery(
      "select u.userName, count(p.id) from User u " + 
      "left join u.posts p group by u.userName"); 
    List x = q.getResultList();  
    for(Object o : x) { 
     Object[] y = (Object[])o; 
     System.out.printf("%s %s\n", y[0], y[1]); 
    } 

    System.out.println("Spring Data JPA -----------------"); 
    for(User user : userRepository.findAll()) { 
     List<Post> posts = postRepository.findAllByAuthor(user); 
     System.out.printf("%s %s\n", user.getUserName(), posts.size()); 
    } 

輸出是:

JPQL ---------------------------- 
user1 0 
user2 0 
Spring Data JPA ----------------- 
user1 3 
user2 10 

我希望JPQL的方法來打印一樣什麼庫方法確實。錯誤在哪裏?

更新

這裏就是SQL跟蹤說:

select 
    user0_.userName as col_0_0_, 
    count(post2_.id) as col_1_0_ 
from User user0_ 
left outer join User_Post posts1_ 
    on user0_.id=posts1_.User_id 
left outer join Post post2_ 
    on posts1_.posts_id=post2_.id 
group 
    by user0_.userName 
+1

只是一個猜測(有沒有很長一段時間使用休眠):嘗試獲得在JPQL中擺脫了'group by'。 –

+0

@MattBall:說SQLGrammarException :-( – agibalov

+0

我不熟悉JPQL,但你沒有指定'join condition'我的意思是表應該加入什麼基礎 – Smit

回答

1

查詢是正確的,但與關係的定義問題。下面是我有什麼:

@Entity 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    ...   
    @OneToMany 
    private List<Post> posts; 
    ... 
} 

@Entity 
public class Post { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    ... 
    @ManyToOne 
    private User author; 
    ... 
} 

看來我不得不UserPost這樣間指定的關係:

@OneToMany(mappedBy = "author") 
    private List<Post> posts;