gpt4 book ai didi

java - Spring Pageable 不翻译@Column 名称

转载 作者:行者123 更新时间:2023-12-05 03:05:03 25 4
gpt4 key购买 nike

我有实体对象:

@Entity(name = "table")
public class SomeEntity {

@Id
@Column(name = "id_column_name")
public final BigDecimal entityId;

@Column(name = "table_column_name")
public final String entityFieldName;

}

我有这样定义的数据库 View :

CREATE OR REPLACE FORCE EDITIONABLE VIEW "V_TABLE" ("ID_COLUMN_NAME", "TABLE_COLUMN_NAME", "SOME_OTHER_COLUMN") AS ... (some SQL magic) 

我有自定义查询的存储库:

@RepositoryRestResource
interface SomeEntityRepository extends PagingAndSortingRepository<SomeEntity, BigDecimal> {

@Query(value = "select id_column_name, table_column_name FROM V_TABLE where some_other_column = ?#{#parameter} order by ?#{#pageable}",
countQuery = "SELECT count(*) from V_TABLE v where some_other_column = ?#{#parameter}",
nativeQuery = true)
Page<SomeEntity> findBySomeParameter(@Param("parameter") long parameter, Pageable pageable);
}

当我使用 url 请求标准数据时,一切正常:http://localhost:8080/someEntity/search/findBySomeParameter?parameter=25&page=0&size=20

但是当我添加排序信息时它不起作用:http://localhost:8080/someEntity/search/findBySomeParameter?parameter=25&page=0&size=20&sort=entityFieldName,asc将抛出以下异常(我使用的是 Oracle 数据库):

Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "ENTITYFIELDNAME": invalid identifier

似乎排序字段没有用 @Column(name) 翻译,而是内联到 SQL 查询中。

有什么方法可以翻译可分页排序,使其不使用字段名而是使用列名?

最佳答案

article阐明了这个问题。从第 3.1 节开始阅读。

显然 native 查询不支持动态排序。实际上,如果您将 findBySomeParameter 方法更改为采用 Sort 而不是 Pageable,您将得到 org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException:不能将 native 查询与动态排序结合使用

使用 pageable 你不会得到异常,分页实际上似乎工作正常,但动态排序不会替换你发现的列名。在我看来,唯一的解决方案是使用 JPQL 而不是 native 查询,只要您需要进行的查询是您提供的查询,这就不是问题。您需要将 View 映射到 SomeEntityView 类才能使用 JPQL。

编辑我认为这个问题没有记录,但它实际上在 official doc

Spring Data JPA does not currently support dynamic sorting for native queries, because it would have to manipulate the actual query declared, which it cannot do reliably for native SQL. You can, however, use native queries for pagination by specifying the count query yourself, as shown in the following example:

关于java - Spring Pageable 不翻译@Column 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51459684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com