gpt4 book ai didi

java - 如何对 Spring Data 中的 case 语句的结果进行排序?

转载 作者:行者123 更新时间:2023-11-30 08:12:48 26 4
gpt4 key购买 nike

我们有一个由以下查询支持的 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

这显然是不完整的。我不确定如何使用它(假设它适合我想要做的 case 语句)并让它返回 Predicate。我什至可能无法使用 Specification 添加 case 语句,尽管我怀疑我可以。我也不确定一旦我让它工作,我将如何将“字段名称”传递给 Sort (我知道如何传递字段名称,我想我只是不知道确定如何确定字段名称)。

值得一提的是,我还不太了解 CriteriaBuilder api。

更新 对我从 an oracle tutorial 中抓取的案例陈述的示例进行了轻微修改这演示了我需要做什么,但我不需要返回对象中大小写列的结果。

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 存储库的同时根据案例语句生成的字段对我的结果进行排序?

最佳答案

这就是我最终所做的。我需要一次获取每个属性(恕我直言,教程并不明显),然后在最后为了返回一个谓词,我创建了另一个我委托(delegate)给它的规范,它具有实际的 where 子句(在本例中是一个简单的 by id ).值得一提的是,.Index.NAME 只是一个包含属性名称的静态字符串,我们还没有决定是否生成元模型。

public class FilterByIdForUserSpecification<AL extends AbstractActivityLogWithSiteUser> implements Specification<AL>
{
private final Sort.Direction direction;
private final Specification<AL> specification;


public FilterByIdForUserSpecification(
final Specification<AL> specification,
final Sort.Direction direction )
{
this.specification = specification;
this.direction = direction;
}

@Override
public Predicate toPredicate(
final Root<AL> root,
final CriteriaQuery<?> query,
final CriteriaBuilder cb )
{
Path<Object> siteUser = root.get( AbstractActivityLogWithSiteUser.Index.USER );
Path<Object> ownerOrg = siteUser.get( SiteUser.Index.PRI_ORG ).get( Organization.Index.OWNER );
Path<Object> fullName = siteUser.get( SiteUser.Index.CONTACT ).get( Contact.Index.FULL_NAME );
Path<Object> roleDisp = siteUser.get( SiteUser.Index.ROLE ).get( Role.Index.DISPLAY );

Expression<Object> queryCase = cb.selectCase()
.when( cb.equal( ownerOrg, true ), roleDisp )
.otherwise( fullName );

query.orderBy( direction( cb, queryCase, direction ) );
return specification.toPredicate( root, query, cb );
}

static Order direction( final CriteriaBuilder cb, final Expression<?> e, final Sort.Direction direction )
{
if ( direction == Direction.ASC )
{
return cb.asc( e );
}
return cb.desc( e );
}
}

关于java - 如何对 Spring Data 中的 case 语句的结果进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30248750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com