一尘不染

Hibernate @ManyToMany joinTable-使用联接表的字段进行订购

hibernate

有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”?还是以其他方式在同一领域下订单?


阅读 235

收藏
2020-06-20

共1个答案

一尘不染

您的代码是正确的,如果您尝试过,它将起作用。一个问题是您正在使用list该列表,因此在缓存中保存该列表时可能不会进行排序,但是如果您清除当前会话并再次获取它,则它将按照设置进行排序@OrderBy(value="orderField")

@OrderBy关于hibernate文档还有一个问题;

列表可以通过两种不同的方式进行映射:

  • 作为有序列表,其中订单未在数据库中实现
  • 作为索引列表,在数据库中实现订单

要对内存中的列表进行排序,请在属性中添加@ javax.persistence.OrderBy。

但是我刚刚尝试了您的问题,并且数据库查询按参数(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")

如果要在联接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;
2020-06-20