【问题标题】:JPA 2.0 - using @OrdercColumn with an unidirectional @ManyToMany relationship with Hibernate 4.0.1JPA 2.0 - 使用具有单向 @ManyToMany 关系的 @OrdercColumn 与 Hibernate 4.0.1
【发布时间】:2012-03-29 18:56:47
【问题描述】:

问题 我有两个实体(列和表)。 A Column 有一个 List 用于存储该列的连接路径,因此我需要非常重要的表的顺序。

这里是实体定义。

@Entity
@javax.persistence.Table(name="Column_")
public class Column extends PersistenceEntity<Column> implements Serializable, Comparable<Column> {

@ManyToMany
@JoinTable(name = "column_joinpath",
joinColumns = {
    @JoinColumn(name = "column_id", referencedColumnName = "id")},
inverseJoinColumns = {
    @JoinColumn(name = "table_id", referencedColumnName = "id")})
@OrderColumn(name="order_index")
private List<Table> joinPath;

/**
* Default constructor
*/
public Column() {
}

表实体没有对列的引用,因为表不应该知道它在哪个 joinPath 中使用。

创建 SQL 语句

create table Table_ (
    id varchar(36) not null,
    displayName varchar(255),
    primary key (id)
)

对于列

create table Column_ (
    id varchar(36) not null,
    primary key (id)
)

对于连接表

create table column_joinpath (
 column_id varchar(36) not null, -- with FK
 table_id varchar(36) not null, -- with FK
 order_index integer not null,  
 primary key (column_id, table_id, order_index)
)

问题:Hibernate 将忽略跟随 JPQL 的 @OrderColumn

Select t.displayName from Column c join c.joinPath t where c = :col

Hibernate 将生成以下 SQL,而没有 order by 语句

    /* Select
    t.displayName 
from
    Column c 
join
    c.joinPath t 
where
    c = :col */ select
        table2_.displayName as col_0_0_ 
    from
        Column_ column0_ 
    inner join
        column_joinpath joinpath1_ 
            on column0_.id=joinpath1_.column_id 
    inner join
        Table_ table2_ 
            on joinpath1_.table_id=table2_.id 
    where
        column0_.id=?

作为解决方法,我使用原生 sql 查询

Select t.displayName from Column_ c inner join column_joinpath joinpath on c.id=joinpath.column_id inner join Table_ t on joinpath.table_id=t.id where c.id=:col order by joinpath.order_index

有没有人可以从 SQL 翻译成 JPQL 或者有什么想法?

提前致谢。

诺曼

【问题讨论】:

    标签: hibernate many-to-many jpa-2.0


    【解决方案1】:

    hibernate 使用 order_index 客户端来填充列表,但不指定 order by。您可以加载 Column 实体,急切地获取 JoinPath 并从 JoinPath 集合中获取显示名称。

    jpql: "from Column c Join fetch c.JoinPath"
    
    for (Table t : column.getJoinPath())
    {
        // do something with t.getDisplayName();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2018-01-21
      • 2016-02-27
      • 2011-08-03
      • 1970-01-01
      • 2012-09-30
      • 2023-03-15
      • 2013-06-17
      • 2021-07-31
      相关资源
      最近更新 更多