【问题标题】:How do I turn item ordering HQL into a filter query?如何将项目订购 HQL 转换为过滤器查询?
【发布时间】:2010-11-30 18:07:17
【问题描述】:

我有这个问题:

sess.createQuery("from Box b join b.items bi order by bi.name").list()

它工作正常。 不过,我有一个hibernate的Collection box,想要过滤的是。 天真的尝试:

 sess.createFilter(boxes, "join this.items bi order by bi.name").list()
 sess.createFilter(boxes, "from this join this.items bi order by bi.name").list()

不要工作!

将此 HQL 转换为过滤器的正确方法是什么?

【问题讨论】:

    标签: java hibernate hql filtering


    【解决方案1】:

    试试……

    session.createFilter(items.getBoxes(), "order by this.name").list()
    

    【讨论】:

    • 呵呵,我感觉自己就像那些在失败博客上发表雅虎答案的青少年一样愚蠢。
    【解决方案2】:

    collection filters时,this指的是集合元素

    你可以这样写:

    sess.createFilter(boxes, "where this.name = ?").list();
    

    也就是说,我在您的示例中看不到任何条件。我不确定集合过滤器中是否允许order by(尚未尝试过),但如果您只想对集合元素进行排序,您可以通过@OrderBy 注释指定排序顺序:

    @OrderBy("name")
    private List items;
    

    【讨论】:

    • 不,我不能写这样的东西,因为我不能那么容易地引入一个联接。您真正的意思是“按this.items.name 订购”,但它不起作用。不,我不能通过@OrderBy 指定排序顺序,因为它是一个顺序,而不是顺序:每次都不一样。您可以在过滤器中使用 order by。
    • 对不起,我看错了你的问题。因此,您尝试通过其自己的集合元素的属性对集合进行排序 - 这将无法作为过滤器的一部分。老实说,我不太确定为什么它会有意义——如果一个“盒子”有物品 A 和 B 而另一个 A 和 C 则结果排序将是随机的。
    • 我重写了这个查询仍然是一个查询,它很丑但它确实有效。感觉问题是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2020-03-28
    • 2013-07-02
    • 2014-06-26
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多