2014-12-10 156 views
1

我正在使用JPA/EclipseLink 2.5.2,並且想要爲我的ManyToMany映射添加附加的where子句。 SQL代碼是這樣的:JPA ManyToMany註釋

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<User> friends; 
} 

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

這又如何實現?

由於提前, 卡西迪

+0

你只定義的表之間的連接。但是,你如何檢索實體?你使用NamedQuery或CriteriaQuery? – 2014-12-10 21:49:52

+0

可能dup http://stackoverflow.com/questions/8582452/jpa-manytomany-how-can-jointable-have-a-property – 2014-12-10 21:50:40

+0

我通過NamedQuery和ManyToMany映射檢索的一個用戶我想檢索列表包含來自JoinTable「朋友」的所有朋友的朋友,其中「Friends.verified = 1」 – Allstar 2014-12-10 22:09:53

回答

1

誠如在我的評論,你需要連接表中的一個附加列指示是否你不能使用@ManyToMany是否驗證。

然後您需要使用@OneToMany和其他實體,比如說友誼。我們可以使用已驗證的列作爲鑑別器,並使用簡單的類層次來區分未確認和已確認的朋友。

這將看起來像下面(沒有完全測試)。

注意,我用Hibernate測試過這個,但是有一個問題需要再次查看。這些帖子表明這個問題可能是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<ConfirmedFriendship> confirmedFriendships; 

    @OneToMany(mappedBy = "user") 
    private Set<UnconfirmedFriendship> unconfirmedFriendships; 

    public List<User> getConfirmedFriends() { 
     return getFriends(confirmedFriendships); 
    } 

    public List<User> getUnconfirmedFriends() { 
     return getFriends(unconfirmedFriendships); 
    } 

    private List<User> getFriends(Set<? extends Friendship> friendships){ 
     List<User> friends = new ArrayList<User>(); 

     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; 
    } 
} 

兩個subclassses其使用驗證列鑑別:

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

} 

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

} 
+0

這正是我一直在尋找!非常感謝你的努力! – Allstar 2014-12-11 10:48:43

+0

出於興趣,鑑於我用Hibernate概述的問題,它是否像EclipseLInk一樣工作? – 2014-12-11 11:09:28

+0

是的,據我測試它,它與EclipseLink工作正常。 – Allstar 2014-12-11 11:52:41

0

我不認爲有JPA標準,包括「去哪兒」選項。 我個人使用NamedQuery來檢索實體。您也可以使用CriteriaQuery。

好,在eclipseLink,你可以使用@AdditionalCriteria(「this.verified = 1」)

+0

當我使用@AdditionalCriteria(「this.verified = 1」)時,我需要創建一個新的實體不是我嗎?是否有可能直接使用成員變量連接NamedQuery?所以我仍然可以在我的用戶類中使用「列表朋友」成員? – Allstar 2014-12-10 22:11:16

+0

@AdditionalCriteria(「this.verified = 1」)是實體級別。我會建議使用NamedQuery:「選擇你從用戶ü加入u.friends f where f.verified = 1」 – 2014-12-10 22:24:52