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

标签 hibernate many-to-many join joincolumn

有 3 个表:

表_A
ID_A
字段1
字段N

TABLE_B
ID_B
字段1
字段N

表_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 ,因此当您在缓存中拥有该列表时可能不会进行排序,但是如果您清除当前 session 并再次获取它,它将按照您使用 设置的方式进行排序>@OrderBy(value="orderField").

此外,@OrderBy 还存在与 hibernate 相关的另一个问题 documentation ;

Lists can be mapped in two different ways:

  • as ordered lists, where the order is not materialized in the database
  • as indexed lists, where the order is materialized in the database

To order lists in memory, add @javax.persistence.OrderBy to your property.

但是我刚刚尝试过你的问题,并且对数据库的查询有按参数排序(hibernate.show_sql=true),所以我不确定他们对上语句的含义。

我的查询示例;

select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname

我的结论是,如果排序是在数据库上完成的,那么您可以安全地使用 @OrderBy 注释。

更新:

@OrderBy 应该具有 native 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;

关于Hibernate @ManyToMany joinTable - OrderBy 使用连接表的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26051764/

相关文章:

java - 以可联合的顺序 hibernate ManyToMany

MySql SELECT 子查询 JOIN

java - 选择动态层次结构的 jpa 自引用中的所有子子详细信息

java - hibernate 和 oracle 序列 GenericGenerator 造成差距

java - Hibernate父子关联

mysql - Propel ORM 在单次保存中添加多对多关系数据

python - Django 多对多字段导致错误

MySQL 选择具有最新日期的记录

javascript - 使用 array.push 进行正确编码

java - 如何将 boolean 参数传递给HQL new构造函数