Jpa JPQL";“非”的成员;使用条件API进行查询
给定以下JPA注释实体类: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
@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)