2016-02-26 33 views
0

我有User类和BattleReportILogItem类。 这个类别(UserBattleReportILogItem)是@EntityJPA从ManyToMany中选择,怎么样?

我不知道,如何编写代码从这个Entity中选择。

我想从BattleReportILogItem中选择setOfBattleLogs

User0..NBattleReportILogItem

USER:

@Entity 
    @Table(name = DomainConstant.TABLE_USER) 
    public class User implements Serializable { 

     @Id 
     @Column(name = DomainConstant.DOMAIN_USER_ID) 
     @GeneratedValue 
     private Long userId; 

     @ManyToMany(cascade = {CascadeType.ALL}) 
     @JoinTable(name = DomainConstant.VIEW_USER_BATTLE_LOGS, joinColumns = { 
      @JoinColumn(name = DomainConstant.DOMAIN_USER_ID)}, inverseJoinColumns = { 
      @JoinColumn(name = DomainConstant.DOMAIN_BATTLE_REPORT_ID)}) 
     private Set<BattleReportILogItem> setOfBattleLogs = new HashSet<>(); 

....(other stuff, get and set methods...) 

BattleReportILogItem

@Entity 
@Table(name = DomainConstant.TABLE_BATTLE_REPORT) 
public class BattleReportILogItem implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name = DomainConstant.DOMAIN_BATTLE_REPORT_ID) 
    private Long BattleReportILogItemId; 

    @ManyToMany(mappedBy = "setOfBattleLogs") 
    private Set<User> setOfBattleLogs = new HashSet<>(); 

    ....(other stuff, get and set methods...) 

我试试

Query q = em.createQuery("select c1 \n" 
     + "from User c1 \n" 
     + "join c1.setOfBattleLogs c2 \n" 
     + "where c1.userId = :c1userId", User.class); 

...所以,这个代码是错误的,我知道... :-(

你能一些身体帮我吗?我在这个stackoverflow站点上读了一些线程,但它不能帮我解决我的问题。

谢谢你的帮助!

回答

0

所以,这个代码是错误的,我知道

不,这不是错了,是什么让你觉得这是什么?

你只需要选择C2而不是C1的:

//I'll rename c1 to u and c2 to b to reduce confusion in the query 
select b from User u join u.setOfBattleLogs b where u.userId = :paramUserId 

当然,你再不能得到User实体的名单,但BattleReportILogItem实体的名单。

顺便说一下,在你的BattleReportILogItem类中你有private Set<User> setOfBattleLogs = new HashSet<>(); - 我假设该集合应该被命名为users或类似的东西。

你也可以交换实体查询:

select b from BattleReportILogItem b join b.users u where u.userId = :paramUserId 
+0

亲爱的托马斯,感谢您的帮助和明确的答案!工作很好。 4分钟后我会接受你的答复。 – nustauos