如何在WHERE子句中使用带有额外条件的JPQL MEMBER OF运算符

时间:2017-10-21 16:12:32

标签: mysql jpa jpql

我有以下实体:

@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关键字还是有更好的解决方案?

0 个答案:

没有答案