Hibernate 按分离表中的列排序

Hibernate order by column in detached tables

我有 4 个 table。对于这个问题,我将它们命名为 tableA, tableB, tableC, tableD.

tableB 看起来像这样:id, name, label, some_other_parameters

tableC 看起来像这样:id, code, some_other_parameters

tableD 列: ID, tableA_id, tableB_id, tableC_id, 实体版本

tableD 中的列未在实体中定义一对多、多对一关联。而且无法更改。原因无所谓,但无法更改。 列的定义如下所示: @Column(名称 - "T_tableA_ID") 私人长 tableAId;

tableB 和 tableC 的列定义看起来相同。

tableD 中的行插入后如下所示:

tableA 不为空,tableB 不为空,tableC 为空

或:

tableA 不为空,tableB 为空,tableC 不为空

我想按顺序从 tableD 获取列表: tableB 行按标签排序 || ' ' || name asc - (不同行的标签可以相同,名称是唯一的) 接着 tableC 行按代码升序排列

甚至可以在标准中这样做吗?

现在我为 tableD 创建了视图并从视图中列出。当我在 tableD 中更新或插入行时,我使用 table 的实体。所以我有两个实体:视图(有列 display_name,我按此列排序)和 table(用于插入和更新)。但是这个解决方案对我来说并不完美。我更喜欢使用标准。

我需要这样的条件:

select * from 
TABLE_D tab_d
where TABLE_A_ID = 1 --example id
order by TABLE_B_ID,
case when TABLE_B_ID is not null then
(select code from TABLE_B where id = tab_d.TABLE_B_ID) 
else
(select label || ' ' || name from TABLE_C where id = tab_d.TABLE_C_ID)
end

另一个 sql returns 按照我需要的方式对数据进行排序:

select tab_d.* from
table_d tab_d
left join table_b tab_b on tab_b.id = tab_d.t_groups_id
left join table_c tab_c on tab_c.id = tab_d.t_users_id
where table_a_id = 10485
order by tab_d.t_groups_id, tab_b.code, tab_c.name || ' ' || tab_c.surname

可以为第一个或第二个 sql 语句创建条件吗?

您可以扩展 org.hibernate.criterion.Order 并提供您自己的实现,为订单生成 SQL。参见 the code example

public class OrderBySqlFormula extends Order {
    private String sqlFormula;

    /**
     * Constructor for Order.
     * @param sqlFormula an SQL formula that will be appended to the resulting SQL query
     */
    protected OrderBySqlFormula(String sqlFormula) {
        super(sqlFormula, true);
        this.sqlFormula = sqlFormula;
    }

    public String toString() {
        return sqlFormula;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        return sqlFormula;
    }

    /**
     * Custom order
     *
     * @param sqlFormula an SQL formula that will be appended to the resulting SQL query
     * @return Order
     */
    public static Order sqlFormula(String sqlFormula) {
        return new OrderBySqlFormula(sqlFormula);
    }
}

然后只需使用您的订单

criteria.addOrder(OrderBySqlFormula.sqlFormula("(a + b) desc"));