我正在使用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
如何实现?
提前致谢, 卡西迪
答案 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”)