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

Posted

技术标签:

【中文标题】Spring Data 以及如何按不在实体中的列进行排序【英文标题】:Spring Data and how to sort by a column not in an Entity 【发布时间】:2015-12-21 08:26:34 【问题描述】:

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

我一直在看的参考资料:

Spring Sort Class Docs

Spring Sort crash course

如果我声明以下查询

@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);

这将产生一个对象列表,其形式为

Object[0] = TableA entity
Object[1] = b.someColumn value

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

如果我执行以下操作

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

那么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");

【问题讨论】:

【参考方案1】:

嗯,看来我在最初的问题中回答了我自己的问题。出于某种原因,我的浏览器没有与我最近的更改保持同步,并且我没有看到排序工作。

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

Sort sort = new Sort(Sort.Direction.DESC, "b.someColumn");

会导致

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

这正是我想要的。

【讨论】:

不起作用。 “原因:org.hibernate.QueryException:无法解析属性” 确实有效,这个方法我用过几十次了。从异常中,听起来它无法解析您尝试使用的排序列。 遗憾的是,它会自动连接绑定的实体别名。 “无法解析属性 b.b.someColumn”。有任何想法吗?你能指定你的 Sping 和 JPA 提供者的版本吗?

以上是关于Spring Data 以及如何按不在实体中的列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过分页在 Spring Data JPA 中的 SELECT 子句中按别名对投影进行排序?

Spring Data Rest with Spring Security - 按当前用户查找所有内容

如何使用 Spring Data 中的 exists 关键字来检查实体是不是存在?

如何按角色限制对 Spring Data REST 投影的访问?

按包括 MAX() 在内的几列分组以限制行但显示不在分组中的列

如何在 Spring Data Rest 中的两个实体之间发布和 PUT 关系@OneToMany / @ManyToOne?