有 3 个表:
表_A
ID_A
字段1
字段N
TABLE_B
ID_B
字段1
字段N
表_A_B
ID_A
ID_B
订单字段
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
,因此当您在缓存中拥有该列表时可能不会进行排序,但是如果您清除当前 session 并再次获取它,它将按照您使用 设置的方式进行排序>@OrderBy(value="orderField")
.
此外,@OrderBy
还存在与 hibernate 相关的另一个问题 documentation ;
Lists can be mapped in two different ways:
- as ordered lists, where the order is not materialized in the database
- as indexed lists, where the order is materialized in the database
To order lists in memory, add @javax.persistence.OrderBy to your property.
但是我刚刚尝试过你的问题,并且对数据库的查询有按参数排序(hibernate.show_sql=true
),所以我不确定他们对上语句的含义。
我的查询示例;
select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname
我的结论是,如果排序是在数据库上完成的,那么您可以安全地使用 @OrderBy 注释。
更新:
@OrderBy
应该具有 native sql 值,例如;
@OrderBy(value="orderField")
private List<TABLE_B> BList;
其中orderField
是表TABLE_B
中列的数据库名称,也可以这样做@OrderBy(value="lower(fullname) desc ”)
如果您想在连接 TABLE_A_B 中创建列,使其与 Java 列表中的顺序保持相同的顺序,那么您应该使用 @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;
关于Hibernate @ManyToMany joinTable - OrderBy 使用连接表的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26051764/