用于 JPA 排序的 Hibernate @Formula 延迟加载
Hibernate @Formula lazy-loading for JPA Sort
我有带 @Formula
字段的实体,其中包含 select 表达式。然后我将该字段称为 Hibernate 元模型的字符串属性,并在 Sort.by()
中使用它,因此在 PageRequest.of()
方法中使用它。它工作得很好,直到我添加 @Basic(fetch = FetchType.Lazy)
,之后我得到 Caused by: org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
和 o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42P10
。
我到底做错了什么?
P. S. 我已经使用 enableLazyInitialization = true
打开了休眠增强功能(据我所知,否则 @Formula 字段的延迟加载将不起作用)
字段代码如下所示:
@Formula("(SELECT st.fio " +
"FROM conjunction_table ct " +
"JOIN second_table st ON st.id = ct.second_table_id " +
"WHERE ct.first_table_id = id " +
"ORDER BY st.fio " +
"LIMIT 1)")
@Basic(fetch = FetchType.LAZY)
private String secondTableFio;
惰性抓取不包括 SELECT DISTINCT
子句中的计算 属性,这会导致此错误,因为 ORDER BY
中现在有一个 属性子句,未选中。
这是受 postgres 限制的,因为 DISTINCT
可以从结果中删除重复的行,这些行实际上可能具有不同的 ORDER BY
值,因此无法决定如何对所选行进行排序:
PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list
我有带 @Formula
字段的实体,其中包含 select 表达式。然后我将该字段称为 Hibernate 元模型的字符串属性,并在 Sort.by()
中使用它,因此在 PageRequest.of()
方法中使用它。它工作得很好,直到我添加 @Basic(fetch = FetchType.Lazy)
,之后我得到 Caused by: org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
和 o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42P10
。
我到底做错了什么?
P. S. 我已经使用 enableLazyInitialization = true
打开了休眠增强功能(据我所知,否则 @Formula 字段的延迟加载将不起作用)
字段代码如下所示:
@Formula("(SELECT st.fio " +
"FROM conjunction_table ct " +
"JOIN second_table st ON st.id = ct.second_table_id " +
"WHERE ct.first_table_id = id " +
"ORDER BY st.fio " +
"LIMIT 1)")
@Basic(fetch = FetchType.LAZY)
private String secondTableFio;
惰性抓取不包括 SELECT DISTINCT
子句中的计算 属性,这会导致此错误,因为 ORDER BY
中现在有一个 属性子句,未选中。
这是受 postgres 限制的,因为 DISTINCT
可以从结果中删除重复的行,这些行实际上可能具有不同的 ORDER BY
值,因此无法决定如何对所选行进行排序:
PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list