JPA ManyToMany在哪里注释

时间:2014-12-10 21:29:14

标签: java jpa eclipselink

我正在使用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<User> friends;
}

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

如何实现?

提前致谢, 卡西迪

2 个答案:

答案 0 :(得分: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;
    }
}

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

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

}

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

}

答案 1 :(得分:0)

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

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