【问题标题】:JPQL - ManyToMany Self referenceJPQL - ManyToMany 自我参考
【发布时间】:2014-04-24 20:08:56
【问题描述】:

我在使用 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

或 Select * from Item where itemsRelated is null

但是它抛出了这个异常:

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

谁能帮帮我?

更新:

Java 调用:

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

此时“查询”有“ itemsRelated 为空”

【问题讨论】:

    标签: java sql jpa playframework jpql


    【解决方案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

    编辑:使用别名完成查询

    【讨论】:

    • 现在错误:itemsRelated 未映射 [来自 models.aquilesModels.entity.Item where itemsRelated IS NOT EMPTY order by createDate desc]
    【解决方案2】:

    我不是 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

    【讨论】:

    • 你能用select语句发布一个java sn-p吗?
    【解决方案3】:

    成功了!

    解决方案是使用 INNER JOIN,让我们看看:

    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)
    

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2013-08-06
      • 2017-02-13
      • 2015-09-11
      • 1970-01-01
      • 2013-10-23
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多