有3个表:
TABLE_A ID_A field1 fieldN
TABLE_B ID_B field1 fieldN
TABLE_A_B ID_A ID_B orderField
public class A(){ @ManyToMany @JoinTable(name="TABLE_A_B", joinColumns={@JoinColumn(name="ID_A")}, inverseJoinColumns={@JoinColumn(name="ID_B")}) @OrderBy(value="orderField") private List<TABLE_B> BList; }
但它不起作用,而是出现运行时错误:
Caused by: org.postgresql.util.PSQLException: ERROR: column B1_.orderField doesn't exist Position: 1437
Hibernate在TABLE_B中搜索该字段。是否可以使用联接表的字段在多对多关系中使用“ OrderBy”?还是以其他方式在同一领域下订单?
您的代码是正确的,如果您尝试过,它将起作用。一个问题是您正在使用list该列表,因此在缓存中保存该列表时可能不会进行排序,但是如果您清除当前会话并再次获取它,则它将按照设置进行排序@OrderBy(value="orderField")。
list
@OrderBy(value="orderField")
@OrderBy关于hibernate文档还有一个问题;
@OrderBy
列表可以通过两种不同的方式进行映射: 作为有序列表,其中订单未在数据库中实现 作为索引列表,在数据库中实现订单 要对内存中的列表进行排序,请在属性中添加@ javax.persistence.OrderBy。
列表可以通过两种不同的方式进行映射:
要对内存中的列表进行排序,请在属性中添加@ javax.persistence.OrderBy。
但是我刚刚尝试了您的问题,并且数据库查询按参数(hibernate.show_sql=true)排序,所以我不确定它们对上层语句的含义。
hibernate.show_sql=true
我的查询示例;
select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname
我将得出结论,如果在数据库上完成订购,那么您可以安全地使用@OrderBy批注。
更新:
@OrderBy 例如,应该具有本地sql值;
@OrderBy(value="orderField") private List<TABLE_B> BList;
orderField表中列的数据库名称在哪里TABLE_B,也可以这样做@OrderBy(value="lower(fullname) desc")
orderField
TABLE_B
@OrderBy(value="lower(fullname) desc")
如果要在联接TABLE_A_B中创建与Java列表中顺序相同的列,则应使用 @OrderColumn(name="orderField")
@OrderColumn(name="orderField")
尝试这个;
@ManyToMany @JoinTable(name="TABLE_A_B", joinColumns={@JoinColumn(name="ID_A")}, inverseJoinColumns={@JoinColumn(name="ID_B")}) @OrderColumn(name="orderField") private List<TABLE_B> BList;