JPQL - ManyToMany Self引用

时间:2014-04-24 20:08:57

标签: java sql jpa playframework jpql

我在使用JPQL进行查询时遇到问题。我有一张桌子,参考了很多人:

@Entity
@Table(name = "item")
public class Item  extends BaseModel implements Serializable {
    @Column(name = "id")
    public INteger id;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    public Set<Item> itemsRelated;

}

我正在尝试进行此查询:

Select * from Item where  itemsRelated=null

或     从项目中选择*,其中itemsRelated为空

但它引发了这个例外:

play.exceptions.JavaExecutionException:从Item中执行查询时出错,其中itemsRelated = null order by createDate desc :未知列&#39; qualified&#39;在&#39; where子句&#39;     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237)     在Invocation.HTTP请求(播放!)

任何人都可以帮助我吗?

更新:

Java调用:

Item.find(query.toString()+" order by createDate desc").fetch(page, itemsPerPage);

此时&#34;查询&#34;已经&#34; itemsRelated为null&#34;

3 个答案:

答案 0 :(得分:1)

itemsRelated是一个集合,你必须检查集合的大小 - 不要期望它是null。尝试

select i from Item i where i.itemsRelated is empty

请参阅http://docs.oracle.com/cd/E17904_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_empty_comp

修改:带别名的已完成查询

答案 1 :(得分:0)

我不是jpql专家,但语法is nullis not null应该有效。 你试过吗

Select * from Item where itemsRelated is null

http://docs.oracle.com/cd/E17904_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_null

答案 2 :(得分:0)

成功!

解决方案是使用INNER JOIN,让se:

id NOT IN (SELECT DISTINCT(i.id) FROM Item i INNER JOIN i.itemsRelated ii)

结果是:

Select * from Item where id NOT IN (SELECT DISTINCT(i.id) FROM Item i INNER JOIN i.itemsRelated ii)

谢谢大家!