Spring Data 以及如何按不在实体中的列排序

Kev*_*vin 5 jpql spring-data

我是 Java Spring 的新手,并试图了解它是如何工作的。我的目标是对不在实体中的 JPQL 查询应用排序。

我一直在看的参考资料:

Spring Sort 类文档

Spring Sort 速成课程

如果我声明以下查询

@Query("SELECT a, b.someColumn FROM TableA a INNER JOIN a.tableB b where a.search like %?1%"
public Page<Object[]> findSomething(String search, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

这将产生具有以下形式的对象列表

Object[0] = TableA entity
Object[1] = b.someColumn value
Run Code Online (Sandbox Code Playgroud)

我一直在阅读 Sort 类,但我还没有找到通过 b.someColumn 进行排序的方法。

如果我执行以下操作

Sort sort = new Sort(Sort.Direction.DESC, "someColumn");
Page<Object[]> things = mgr.findSomething("junk", sort);
Run Code Online (Sandbox Code Playgroud)

然后 JPQL 结果

SELECT a, b.someColumn FROM TableA a INNER JOIN a.tableB b where a.search like ?1 order by a.someColumn

当我想要它时

SELECT a, b.someColumn FROM TableA a INNER JOIN a.tableB b where a.search like ?1 order by b.someColumn

如何防止它将排序列附加到查询中的实体?有没有办法禁用此功能并使其按字面意思解释我的排序列?是否有更好的排序技术更适合我的情况?

Sort sort = new Sort(Sort.Direction.DESC, "b.someColumn");
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 5

好吧,看起来我在原来的问题中回答了我自己的问题。由于某种原因,我的浏览器没有及时更新我最近的更改,并且我没有看到排序工作。

引擎将按字面解释排序列。

Sort sort = new Sort(Sort.Direction.DESC, "b.someColumn");
Run Code Online (Sandbox Code Playgroud)

将会导致

SELECT a, b.someColumn FROM TableA a INNER JOIN a.tableB b where a.search like ?1 order by b.someColumn

这正是我想要的。