为什么实体的比较在子查询中不起作用

时间:2013-08-29 07:35:58

标签: java jpa entity jpa-2.0

有人可以解释一下,为什么这个查询在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

我花了几个小时直到找到错误的这个简单原因,并且有兴趣知道什么时候可以比较实体,什么时候不能?

2 个答案:

答案 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的模式类型。