有3张表:
TABLE_A
ID_A
field1
fieldN
TABLE_B
ID_B
field1
fieldN
表_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
因此,虽然您在缓存中拥有该列表可能不会被排序,但是如果您清除当前会话并再次获取它,它将按照您设置的顺序进行排序@OrderBy(value="orderField")
.
还有另一个问题@OrderBy
关于冬眠文档;
列表可以通过两种不同的方式进行映射:
- 作为有序列表,其中顺序未在数据库中具体化
- 作为索引列表,其中顺序在数据库中具体化
要对内存中的列表进行排序,请将 @javax.persistence.OrderBy 添加到您的
财产。
但我刚刚尝试过你的问题,数据库查询按参数排序(hibernate.show_sql=true
),所以我不确定他们上面的陈述是什么意思。
我的查询示例;
select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname
我的结论是,如果在数据库上完成排序,那么您可以安全地使用 @OrderBy 注释。
UPDATE:
@OrderBy
例如,应该具有本机 sql 值;
@OrderBy(value="orderField")
private List<TABLE_B> BList;
where 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)