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?