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

时间:2014-09-26 03:52:49

标签: hibernate many-to-many jointable joincolumn

共有3个表格:

TABLE_A
ID_A
FIELD1
字段N

表-B
ID_B
FIELD1
字段N

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”?或者根据同一领域的任何其他方式进行订购?

1 个答案:

答案 0 :(得分:10)

您的代码是正确的,您是否尝试过,它会起作用。一个问题是你正在使用list所以当你在缓存中有这个列表可能不会被排序,但是如果你清除当前会话并再次获取它将按你设置{{1 }}

还有@OrderBy(value="orderField")关于休眠documentation的另一个问题;

  

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

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

要在内存中订购列表,请将@ javax.persistence.OrderBy添加到您的   属性。

但是我刚试过你的问题并且数据库查询按参数(@OrderBy)排序,所以我不确定它们对于上层语句的意义。

我的查询示例;

hibernate.show_sql=true

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

<强>更新

select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname 应具有本机sql值,例如;

@OrderBy

其中@OrderBy(value="orderField") private List<TABLE_B> BList; 是表orderField中列的数据库名称,也可以执行此操作TABLE_B

如果要在连接TABLE_A_B中创建列,该列与java中的列表中的列相同,那么您应该使用@OrderBy(value="lower(fullname) desc")

试试这个;

@OrderColumn(name="orderField")