8

有3张表:

TABLE_A
ID_A
字段
1 字段 N

TABLE_B
ID_B
字段
1 字段 N

TABLE_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”?或者任何其他方式来获得基于同一领域的订单?

4

1 回答 1

11

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

@OrderBy关于休眠文档还有另一个问题;

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

  • 作为有序列表,其中订单未在数据库中具体化
  • 作为索引列表,其中订单在数据库中具体化

要在内存中排序列表,请将 @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;
于 2014-09-26T11:11:51.293 回答