JPA ManyToMany在哪里注释

我正在使用JPA / EclipseLink 2.5.2,并希望在ManyToMany Mapping中添加一个额外的where子句。 SQL代码如下所示:

SELECT * FROM Friends f INNER JOIN User u ON f.friend_id = u.id WHERE f.verified=1; 

所以我设法做了JoinMapping:

 @Entity @NamedQueries({ @NamedQuery(name="User.findAll", query="SELECT u FROM User u"), @NamedQuery(name="User.login", query="SELECT a FROM User a WHERE a.username = :name and a.password = :password"), @NamedQuery(name="User.findId", query="SELECT a FROM User a WHERE a.id = :id"), @NamedQuery(name="User.findName", query="SELECT a FROM User a WHERE a.username = :name") }) public class User implements Serializable { ... @ManyToMany @JoinTable( name="Friends" , joinColumns={ @JoinColumn(name="user_id") } , inverseJoinColumns={ @JoinColumn(name="friend_id") } ) List friends; } 

但我不知道如何添加WHERE f.verified=1

怎么能实现呢?

提前谢谢,卡西迪

正如我在评论中所建议的那样,您不能使用@ManyToMany,因为您需要在连接表中添加其他列以指示是否已validation。

然后你需要使用@OneToMany和一个额外的实体,比如友谊。 我们可以使用经过validation的列作为鉴别器,并使用简单的类层次结构来区分未确认的和确认的朋友。

这将看起来像下面(没有完全测试)。

注意,我用Hibernate测试了这个,但是有一个问题所以需要再次查看。 这些post暗示问题可能是Hibernate特定的:

所以可能值得尝试使用EclipseLink。

 @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private int id; @OneToMany(mappedBy = "user") private Set confirmedFriendships; @OneToMany(mappedBy = "user") private Set unconfirmedFriendships; public List getConfirmedFriends() { return getFriends(confirmedFriendships); } public List getUnconfirmedFriends() { return getFriends(unconfirmedFriendships); } private List getFriends(Set friendships){ List friends = new ArrayList(); for(Friendship friendship : friendships) { friends.add(friendship.getFriend()); } return friends; } } 

友谊基础实体:

 @Entity @Table(name = "friendships") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "verified") public abstract class Friendship { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private int id; @ManyToOne @JoinColumn(name = "user_id") private User user; @ManyToOne @JoinColumn(name = "friend_id") private User friend; @Column(name = "verified") private boolean verified; public int getId() { return id; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public User getFriend() { return friend; } public void setFriend(User friend) { this.friend = friend; } public boolean isVerified() { return verified; } public void setVerified(boolean verified) { this.verified = verified; } } 

两个子类使用经过validation的列作为鉴别器:

 @Entity @DiscriminatorValue(value = "1") public class ConfirmedFriendship extends Friendship { } @Entity @DiscriminatorValue(value = "0") public class UnconfirmedFriendship extends Friendship { } 

我不认为有JPA标准包括“Where”选项。 我个人使用NamedQuery来检索实体。 您也可以使用CriteriaQuery。

那么,在eclipseLink中 ,你可以使用@AdditionalCriteria(“this.verified = 1”)