Hibernate @ManyToMany joinTable - OrderBy使用连接表的字段

Dan*_*ana 6 many-to-many hibernate jointable joincolumn

有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;
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,而是我得到一个运行时错误:

Caused by: org.postgresql.util.PSQLException: ERROR: column B1_.orderField doesn't exist Position: 1437
Run Code Online (Sandbox Code Playgroud)

Hibernate在TABLE_B中搜索字段.是否可以使用连接表的字段在多对多关系中使用"OrderBy"?或者任何其他方式来获得基于相同领域的订单?

Pet*_*vic 10

你的代码是正确的,你试过,它会工作.一个问题是你正在使用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
Run Code Online (Sandbox Code Playgroud)

我将得出结论,如果在数据库上进行排序,那么您可以安全地使用@OrderBy注释.

更新:

@OrderBy 应该具有本机sql值,例如;

@OrderBy(value="orderField")
private List<TABLE_B> BList;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 我想知道是否可以使用连接表的字段来对值进行排序。我更新了我的问题。 (2认同)
  • 是的,有可能,我只是想确认一下我的想法.你试过@OrderColumn了吗? (2认同)