【问题标题】:Spring Data and how to sort by a column not in an EntitySpring Data 以及如何按不在实体中的列进行排序
【发布时间】: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");

【问题讨论】:

    标签: spring-data jpql


    【解决方案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 提供者的版本吗?
    猜你喜欢
    • 2018-12-03
    • 2023-02-10
    • 2018-09-07
    • 2012-11-20
    • 1970-01-01
    • 2020-09-04
    • 2023-03-04
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多