【发布时间】:2015-07-26 17:50:33
【问题描述】:
我们有一个由以下查询支持的 UI 可排序表,单击列会在该列上执行 order by 升序或降序。问题是其中一列根据条件呈现用户角色名称或他们的人名,我们需要能够对该列进行排序。
目前这是存储库定义
Page<UserActivityLog> findByActivityTargetUserId( Long id, Pageable pageable );
我正在尝试编写一个看起来或多或少像这样的规范。
private static class UserSpecification implements Specification<UserActivityLog> {
@Override
public Predicate toPredicate(
final Root<UserRelatedEntity> root,
final CriteriaQuery<?> query,
final CriteriaBuilder cb )
cb.selectCase()
.when( root.<Boolean>get( "user.setting.fieldBoolean" ),
root.<RoleType>get( "user.role.roleTypeEnum" ).toString() )
.otherwise( root.<String>get("user.humanNameString") )
... //magic
这显然是不完整的。我不确定如何接受这个(假设它适合我想要做的案例陈述)并让它返回Predicate。我什至可能无法使用Specification 添加案例陈述,尽管我怀疑我可以。我也不确定一旦我让它工作,我将如何将“字段名称”传递给Sort(我知道如何传递字段名称,我想我只是不确定如何弄清楚字段名称是什么)。
值得一提的是,我还不太了解CriteriaBuilder api。
更新我从an oracle tutorial 中抓取的一个案例语句的稍微修改的示例,它演示了我需要做什么,我不需要在我的回报中使用 case-ed 列的结果对象。
SQL> select job, ename
2 , case
3 when msal <= 2500
4 then 'cheap'
5 else 'expensive'
6 end as class
7 from employees
8 where bdate < date '1964-01-01'
9 order by class;
如何在仍然使用 Spring Data 存储库的同时根据 case 语句生成的字段对结果进行排序?
【问题讨论】:
标签: java jpa-2.0 spring-data spring-data-jpa criteria-api