Jpa JPQL";“非”的成员;使用条件API进行查询

Jpa JPQL";“非”的成员;使用条件API进行查询,jpa,criteria,eclipselink,Jpa,Criteria,Eclipselink,给定以下JPA注释实体类: @Entity @Table("foo") public class Foo { @Id private int id; @Column(name="name") private String name; @ManyToMany @JoinTable(name = "foo_tags", joinColumns = {@JoinColumn(name = "foo")}, inverseJoi

给定以下JPA注释实体类:

@Entity
@Table("foo")
public class Foo {
    @Id private int id;
    @Column(name="name") private String name;
    @ManyToMany
    @JoinTable(name = "foo_tags",
           joinColumns = {@JoinColumn(name = "foo")},
           inverseJoinColumns = {@JoinColumn(name = "tag")})
    private Collection<Tag> tags;
    ...
}

@Entity
@Table(name = "tag")
public class Tag {
    @Id private String tag;
    ...
}
但是,我很难将其转换为条件查询。翻译(对我来说)似乎很明显:

当条件查询生成以下内容时:

SELECT t1.id, t1.name FROM tag t0, foo_tags t2, Foo t1
WHERE (NOT ((t0.TAG = 'blue')) AND ((t2.foo = t1.id) AND (t0.TAG = t2.tag)))

我只使用eclipselink实现测试了这一点,因此可能存在问题,但我想首先在这里询问是否有人发现了明显的错误。

SQL应该是相同的,尽管两者似乎都可以工作(不包括空的情况)

请在EclipseLink中记录标准问题的错误

您应该能够使用联接或子选择,而不是语法的特殊成员

SELECT f FROM Foo f left join f.tags t WHERE not(t == :tag)

似乎这是一个Eclipselink问题,使用Hibernate的JPA实现(3.5.0.Final),正确生成了条件查询。此问题在Eclipselink 2.4 RC 2中仍然存在。不幸的是,如果一个Foo有多个与之相关联的标记,则第二个SQL不起作用。我只是遇到了与日食相同的问题
SELECT t0.id, t0.name FROM foo t0
WHERE NOT EXISTS (
    SELECT DISTINCT t2.TAG FROM tag t2, foo_tags t1
    WHERE (((t1.foo = t0.id) AND (t2.TAG = t1.tag)) AND ('blue' = t2.TAG)))
SELECT t1.id, t1.name FROM tag t0, foo_tags t2, Foo t1
WHERE (NOT ((t0.TAG = 'blue')) AND ((t2.foo = t1.id) AND (t0.TAG = t2.tag)))
SELECT f FROM Foo f left join f.tags t WHERE not(t == :tag)