我有以下实体:
@Entity
@Table(name = "LETTERS")
public class Letter {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
@ManyToOne
@JoinColumn(name = "SENDER_ID")
protected User sender;
@ManyToMany
@JoinTable(name = "LETTERS_RECIPIENTS",
joinColumns = @JoinColumn(name = "LETTER_ID"),
inverseJoinColumns = @JoinColumn(name = "RECIPIENT_ID"))
protected final List<User> recipients;
……………………..
}
映射到这些数据库表:
LETTERS
ID SENDER_ID
3 5
LETTERS_RECIPIENTS
LETTER_ID RECIPIENT_ID
3 6
3 7
我尝试使用以下JPQL查询查询表:
"SELECT new " + LetterInfo.class.getCanonicalName() + "(o) FROM " + Letter.class.getSimpleName() + " AS o WHERE o.sender = :user OR :user MEMBER OF o.recipients"
"SELECT new " + LetterInfo.class.getCanonicalName() + "(o) FROM " + Letter.class.getSimpleName() + " AS o JOIN o.recipients AS r WHERE o.sender = :user OR r = :user"
Query q = em.createQuery(…);
q.setParameter("user", p_user);
List<LetterInfo> result = q.getResultList();
其中 p_user.id = 5
并获得 result.size()= 2
虽然当我只使用WHERE o.sender = :user
时,我得到 result.size()= 1 以及何时
只有WHERE :user MEMBER OF o.recipients
才能按预期获得 result.size()= 0 。
编辑:启用SQL日志记录后,我发现EclipseLink将第一个带有MEMBER OF运算符的查询转换为:
SELECT L.ID, L.SENDER_ID
FROM LETTERS_RECIPIENTS LR, USERS U, LETTERS L
WHERE (L.SENDER_ID = 5 OR 5 = U.ID) AND (LR.LETTER_ID = L.ID AND U.ID = LR.RECIPIENT_ID)
所以似乎唯一的解决方案是使用DISTINCT关键字还是有更好的解决方案?