【问题标题】:Hibernate @OrderBy for nested propertiesHibernate @OrderBy 用于嵌套属性
【发布时间】:2012-05-18 02:15:09
【问题描述】:

我需要使用@OrderBy(JPA,Hibernate 作为提供者)对嵌套属性的集合进行排序:

@OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
@OrderBy("release.ordinal")
private List<PkdbParameter> pkdbParams;

在 PkdbParameter.java 中:

...
@ManyToOne
@JoinColumn(name = "release_id")
private Release release;
...

在 Release.java 中:

...
private int ordinal;
...

(所有这些字段都提供了简单的 getter 和 setter)

很遗憾,我遇到了错误:

Caused by: org.hibernate.AnnotationException: property from @OrderBy clause not found: some.package.PkdbParameter.release.ordinal

这段代码有什么问题?如果无法使用嵌套属性表示法,还有其他方法可以为ordinal 属性订购吗?

【问题讨论】:

    标签: java hibernate jpa orm hibernate-mapping


    【解决方案1】:

    你可以使用Hibernate @SortComparator注解:

    像这样:

    @OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
    @SortComparator(ReleaseComparator.class)
    private List<PkdbParameter> pkdbParams;
    

    CameraNameComparator 在哪里:

    public class ReleaseComparator implements Comparator<PkdbParameter> {
        @Override
        public int compare(PkdbParameter o1, PkdbParameter o2) {
            return o1.getRelease().getOrdinal().compareTo( o2.getRelease().getOrdinal() );
        }
    }
    

    【讨论】:

      【解决方案2】:

      @OrderBy 仅适用于直接属性或嵌入属性。来自Java EE 6 docs

      点(“.”)符号用于引用嵌入属性中的属性

      所以如果Release 是一个嵌入的属性,这可以工作。否则,您可以按照建议使用命名查询here

      【讨论】:

        【解决方案3】:

        您可以拆分订单语句并将其放在非集合属性上:

        @OneToMany(mappedBy = "paramSpec", cascade = CascadeType.ALL)
        @OrderBy("release")
        private List<PkdbParameter> pkdbParams;
        

        @ManyToOne
        @JoinColumn(name = "release_id")
        @OrderBy("ordinal")
        private Release release;
        

        作为一个副作用,您有固定的 PkdbParameter 排序顺序。

        【讨论】:

        • 我试过这个,但似乎只是忽略了订购 ManyToOne。
        • 这将简单地 ORDER BY pkdbParams1_.release 并完全忽略 ordinal 属性,这肯定不是原始发布者想要的。
        • Hibernate 版本的行为是否可能不同?
        • 在你的persistence.xml文件中设置hibernate.show_sql = true,你自己看看Hibernate创建了什么SQL代码。
        • 感谢您验证这篇论文。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多