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

Java 为什么实体比较在子查询中不起作用,java,jpa,entity,jpa-2.0,Java,Jpa,Entity,Jpa 2.0,有人能解释一下,为什么这个查询在JPA中起作用: SELECT e FROM Entry e JOIN e.tags tags WHERE tags IN :tags e、 标签是 @ManyToMany(mappedBy = "entryList" ) private List<Tag> tags = new LinkedList<>(); 没有错误,但未找到任何结果。如果我向parameter:tags提供一个标记ID列表并执行以下查询,那么它工作正常: SEL

有人能解释一下,为什么这个查询在JPA中起作用:

SELECT e FROM Entry e JOIN e.tags tags WHERE tags IN :tags 
e、 标签是

@ManyToMany(mappedBy = "entryList" )
private List<Tag> tags = new LinkedList<>();
没有错误,但未找到任何结果。如果我向parameter:tags提供一个标记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

我花了几个小时才找到这个简单的错误原因,我想知道什么时候可以比较实体,什么时候不可以比较实体?

我认为JPA soec不允许在in中使用对象。某些提供程序可能会,但这可能取决于您使用的版本、对象是否具有复合id以及您使用的数据库


如果它不起作用,您可以尝试最新版本,或者记录一个bug。

第一个查询预计不起作用。表达式中条件运算符的左侧不能是实体。可以使用的是枚举、字符串、数字和日期类型。右侧的允许值取决于左侧的内容。在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   
状态字段路径表达式必须具有字符串、数字、日期、时间、时间戳或枚举值

文字和/或输入参数值必须类似于同一个摘要 类型中的
状态\字段\路径\表达式的架构类型


但是第一个查询在JPA2.1和Glassfish 4.0上对我有效。所以我认为第二个也应该起作用。由于上述原因,第一个和第二个查询(在比较中使用实体的查询)在规范中都是无效的。JPA2.1也没有改变这一点。若有些东西能起作用,那个只是因为供应商决定(或完全意外地实现)方便的扩展。
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