在JPA订购不起作用

时间:2011-09-21 14:40:45

标签: hibernate jpa

我正在使用JPA和Hibernate实现。我在实体MyTable中有一个命名查询:

@NamedQuery(name = "myQuery", query = "select val from MyTable val") 

myTable实体包含与另一个实体的foriegn密钥关系。

@OneToMany(mappedBy = "myTable ", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
private Set<ReferenceTable> tbl;

在ReferenceTable实体中有一个字段,当JPA运行上面显示的命名查询时,我需要按排序顺序获取。我试过@OrderBy但是没有用。

非常感谢任何帮助。

谢谢, NKS

3 个答案:

答案 0 :(得分:1)

显然@OrderBy与Hibernate的JPA实现不兼容:

http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#entity-mapping-association-collections

这就是你正在使用的吗?

无论如何,请尝试在JPQL查询中添加“order by”,例如

选择...按tbl DESC排序

此外,如果您想要完全灵活,请进行本机SQL查询,您可以根据自己的喜好选择自己的东西并订购。您甚至可以告诉您的本机查询它应该对结果进行编组,因此您可以获得与JPQL查询相同的功能,但实际查询的精度更高:

@NamedNativeQuery(

名称= “更改为MyQuery”, query =“SELECT .... order by ... asc” resultClass = MyJPAEntity.class )

您可以将上述内容作为实体bean类的类级别注释。

是的,我确实得到了使用orm框架的讽刺意味,但仍然被迫依赖于基本的sql。

答案 1 :(得分:0)

组&LT; ..&GT;即使DB / JPA返回有序集合,impl也将被取消订单。你可以使用SortedSet,如hibernate文档中的这个例子所示

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="CUST_ID")
@Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
public SortedSet<Ticket> getTickets() {
    return tickets;
}

来源:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-sorted

答案 2 :(得分:0)

除非你使用org.hibernate.annotations.Sort,它使用比较器在Java中进行排序,否则最好没有java.util.Set。使用set不会帮助你进行排序(Hibernate在这里可以选择的最好的东西是LinkedHashSet)。我也怀疑你用它来确保元素是唯一的。

我认为您最好使用最通用的java.util.Collection。 Hibernate默认使用ArrayList,它将保持结果集的顺序。但是,Hibernate对@OrderBy的实现很糟糕,它似乎没有完全实现JPA 2.0,也没有在4.1.9中实现。这也可能是你遇到麻烦的原因。