共有3个表格:
TABLE_A
ID_A
FIELD1
字段N
表-B
ID_B
FIELD1
字段N
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”?或者根据同一领域的任何其他方式进行订购?
答案 0 :(得分:10)
您的代码是正确的,您是否尝试过,它会起作用。一个问题是你正在使用list
所以当你在缓存中有这个列表可能不会被排序,但是如果你清除当前会话并再次获取它将按你设置{{1 }}
还有@OrderBy(value="orderField")
关于休眠documentation的另一个问题;
列表可以通过两种不同的方式进行映射:
- 作为有序列表,其中订单未在数据库中实现
- 作为索引列表,其中订单在数据库中具体化
要在内存中订购列表,请将@ javax.persistence.OrderBy添加到您的 属性。
但是我刚试过你的问题并且数据库查询按参数(@OrderBy
)排序,所以我不确定它们对于上层语句的意义。
我的查询示例;
hibernate.show_sql=true
我将得出结论,如果在数据库上进行排序,那么您可以安全地使用@OrderBy注释。
<强>更新强>
select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname
应具有本机sql值,例如;
@OrderBy
其中@OrderBy(value="orderField")
private List<TABLE_B> BList;
是表orderField
中列的数据库名称,也可以执行此操作TABLE_B
如果要在连接TABLE_A_B中创建列,该列与java中的列表中的列相同,那么您应该使用@OrderBy(value="lower(fullname) desc")
试试这个;
@OrderColumn(name="orderField")