1

有人可以解释一下,为什么这个查询在 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 列表提供给参数 :tags 并执行以下查询,则它可以正常工作:

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

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

4

2 回答 2

1

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

如果它不起作用,您可以尝试最新版本,或记录错误。

于 2013-08-29T14:57:41.207 回答
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_expressionin 类型的抽象模式类型相同。

于 2013-08-29T19:24:44.043 回答