Порядок по полю с подчеркиванием в формуле в репозитории Spring Data JPA?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Порядок по полю с подчеркиванием в формуле в репозитории Spring Data JPA?

Сообщение Anonymous »

Я использую репозиторий Spring Data JPA и имею собственный запрос, в котором одно из полей создается с помощью оператора CASE и получает псевдоним с подчеркиванием (например, _myfield). Этот псевдоним используется в предложении ORDER BY запроса. Вот как структурированы мои занятия.

Код: Выделить всё

public class OuterClass() {

/...
@Id
@Column(name = "id")
private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_inner", nullable = false, insertable = false, updatable = false)
private InnerClass innerElement;

}

public class InnerClass() {

/...

@Formula("""
CASE
WHEN t2.field2 IS NULL THEN t2.field3
ELSE t2.field2 || ' ' || t2.field4
END) _my_field
"""
private String _myField;

}
Я пробовал использовать разные методы запроса в репозитории JPA для OuterClass, но все они возвращают одну и ту же ошибку при попытке сгенерировать запрос ORDER BY . Некоторые из моих попыток включают, помимо прочего, следующие методы:

Код: Выделить всё

@EntityGraph(attributePaths = {"innerElement"})
@Query("SELECT o FROM OuterClass o WHERE o.id = :id ORDER BY o.innerElement._myField")
List findById(@Param("id") Integer id);

@EntityGraph(attributePaths = {"innerElement"})
List findByIdOrderByInnerElement__MyField(@Param("id") Integer id);
Все они генерируют одну и ту же ошибку, поскольку JPA пытается создать предложение ORDER BY, включая оператор CASE

Код: Выделить всё

SELECT
...
WHERE
...
ORDER BY
CASE
WHEN t2.field2 IS NULL THEN t2.field3
ELSE t2.field2 || ' ' || t2.field4
END) _my_field
Это всегда генерирует исключение SQL.

Код: Выделить всё

Caused by: org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [select
...,  (CASE
WHEN t2.field2 IS NULL THEN t2.field3
ELSE t2.field2 || ' ' || t2.field4
END) _my_field
,
...
order by   (CASE
WHEN t2.field2 IS NULL THEN t2.field3
ELSE t2.field2 || ' ' || t2.field4
END) _my_field
] [ERROR: syntax error at or near "_my_field"
Position: 919] [n/a]
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:91) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:264) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:167) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:265) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:145) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:67) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:204) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:211) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:83) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:76) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:65) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$2(ConcreteSqmSelectQueryPlan.java:139) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:382) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:302) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:526) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:423) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.Query.getResultList(Query.java:120) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129)
Как заставить этот запрос работать правильно, сохраняя при этом псевдоним _myField в предложении ORDER BY?

Подробнее здесь: https://stackoverflow.com/questions/791 ... repository
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»