有人可以解释一下,为什么这个查询在JPA中起作用:
SELECT e FROM Entry e JOIN e.tags tags WHERE tags IN :tags
e.tags是
@ManyToMany(mappedBy = "entryList" )
private List<Tag> tags = new LinkedList<>();
因此,我可以将标签中的实体与参数中的实体进行比较。但是以下不起作用:
SELECT e FROM Entry e WHERE (SELECT COUNT(t) FROM Tag t JOIN t.entryList e2 WHERE e2 = e AND t IN :tags) = :size
没有错误,但未找到任何结果。如果我给参数:标签提供标签ID列表并执行以下查询,它正常工作:
SELECT e FROM Entry e WHERE (SELECT COUNT(t) FROM Tag t JOIN t.entryList e2 WHERE e2 = e AND t.id IN :tagIds) = :size
我花了几个小时直到找到错误的这个简单原因,并且有兴趣知道什么时候可以比较实体,什么时候不能?
答案 0 :(得分:1)
我不认为JPA soec允许IN中的对象。某些提供程序可能,但它可能取决于您使用的是哪个版本,如果您的对象具有复合ID,以及您正在使用的数据库。
如果它不起作用,您可以尝试最新版本,或记录错误。
答案 1 :(得分:1)
预计第一个查询不起作用。 IN表达式中条件运算符的左侧不能是实体。可以使用的是枚举,字符串,数字和日期类型。右侧的允许值确实取决于左侧的值。在JPA 2.0规范中,这被告知如下:
in_expression::=
{state_field_path_expression | type_discriminator} **[NOT] IN**
{ ( in_item {, in_item}* ) | (subquery)
|collection_valued_input_parameter }
in_item ::= literal | single_valued_input_parameter
state_field_path_expression
必须包含字符串,数字,日期,时间,时间戳或枚举值。文字和/或输入参数值必须与同一摘要相同 类型中
state_field_path_expression
的模式类型。