我正在使用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
答案 0 :(得分:1)
显然@OrderBy与Hibernate的JPA实现不兼容:
这就是你正在使用的吗?
无论如何,请尝试在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中实现。这也可能是你遇到麻烦的原因。