【问题标题】:Help with JPQL queryJPQL 查询帮助
【发布时间】:2011-02-01 15:57:54
【问题描述】:

我必须查询Message,它位于Groups 提供的列表中,并且当前用户不是Deactivated。下面是一些伪代码来说明属性和实体:

class Message {
  private int messageId; 
  private String messageText;
}

class Group {
  private String groupId;
  private int messageId;
}

class Deactivated {
  private String userId;
  private int messageId;
}

这是我需要查询的内容的一个想法,它是我不知道该怎么做的最后一个 AND 子句(我组成了复合 NOT IN 表达式)。按 userId 过滤停用的消息可能会导致多个 messageId,如何检查该行子集是否不包含 messageId?

SELECT msg FROM Message msg, Group group, Deactivated unactive
在哪里
  group.messageId = msg.messageId
  AND (group.groupId = 'groupA' OR group.groupId = 'groupB' OR ...)
  AND ('someUserId', msg.messageId) 不在 (unactive.userId, unactive.messageId)

注意:... 之所以存在,是因为我事先不知道 groupId 的数量。我将它们作为Collection<String> 接收,因此我需要遍历它们并将它们动态添加到 JPQL。

【问题讨论】:

  • 您能否澄清问题(顺便说一句,您可以使用AND group.groupId IN (:list) 而不是多个OR)?
  • 感谢您提供减少分支条件的提示。问题是 ('someUserId', msg.messageId) NOT IN (unactive.userId, unactive.messageId) 无效 - 我不知道如何构造这部分查询。也许一个子查询是有序的?

标签: jpa jpql openjpa


【解决方案1】:

您似乎在查询中制作笛卡尔积。您需要有一个子查询才能到达您的结果。你可以有这样的查询:

 SELECT msg
 FROM Message msg, Group grp
 WHERE msg.id = grp.msgId 
       AND grp.id IN (...)
       AND msg.id NOT IN (SELECT msgId FROM Desactivated WHERE userId = 'uid') 

【讨论】: