小编Ped*_*les的帖子

使用规范按父实体排序

我正在处理一个我认为无法在Spring Data JPA上支持的问题。

我在视图上得到一个网格(使用jQuery的JqGrid插件),该网格将参数发送到服务器,对其进行解析,然后执行通过Specification生成的动态查询。

当我要订购不属于根实体的列时,问题就来了。

例如。交易,卡和帐户是我的实体,网格显示last4digits作为用户识别卡的方式。您可以想象last4digits属于Card。我查询每个帐户的交易。

使用规范,我可以按该属性进行过滤,联接表等,但是排序失败,因为findAll()实现假定Sort类的属性属于根实体。

代码示例:

JQGridRule panFirst6DigitsRule = FilterUtils.findSearchOrFilterRule(settings, Card_.panFirst6Digits.getName());
JQGridRule panLast4DigitsRule = FilterUtils.findSearchOrFilterRule(settings, Card_.panLast4Digits.getName());
if(panFirst6DigitsRule != null) {
    filterPan1 = TransactionSpecs.withPanFirst6Digits(panFirst6DigitsRule.getData(),
        panFirst6DigitsRule.getOp(), gridGroupOp);
}
if(panLast4DigitsRule != null) {
    filterPan2 = TransactionSpecs.withPanLast4Digits(panLast4DigitsRule.getData(),
        panLast4DigitsRule.getOp(), gridGroupOp);
}

Specification<Transaction> joinSpec = TransactionSpecs.withAccountId(account.getAccountId());
Specification<Transaction> activeSpec = BaseSpecs.withEntityStatus(true);
Page<Transaction> results = transactionRepository.findAll(
    Specifications.where(joinSpec).and(filterSpec).and(filterPan1).and(filterPan2).and(activeSpec), springPageable);
Run Code Online (Sandbox Code Playgroud)

springPageable变量包含以这种方式生成的Sort for last4Digits列*:

List<Order> sortOrders = new ArrayList<Order>();
Order sortOrder = new Order(Direction.ASC, "panLast4Digits");
sortOrders.add(sortOrder);
sort = new Sort(sortOrders);
Run Code Online (Sandbox Code Playgroud)

*缺少代码解析参数,无法创建更多Order对象

有人知道如何对属于父实体/类的属性实施这种排序吗?

提前致谢

用于Spring-data-jpa的1.4.3版本和用于Hibernate的4.2.8版本

编辑

显示如何生成panLast4Digits的规范

public static Specification<Transaction> …
Run Code Online (Sandbox Code Playgroud)

java sql hibernate jpa spring-data-jpa

1
推荐指数
1
解决办法
3128
查看次数

标签 统计

hibernate ×1

java ×1

jpa ×1

spring-data-jpa ×1

sql ×1