Spring data jpa 复杂动态查询方式总结

Spring data jpa 复杂动态查询方式总结

前略...

四.继承JpaSpecificationExecutor接口进行复杂查询

使用 这个接口

public Predicate toPredicate(Root<Equipment> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) 

需要了解: CriteriaBuilder 接口的使用

CriteriaBuilder 用于构建 查询,计算选择,表达式,条件, 排序等

用到了: 相等条件, and, or

Predicate equal(Expression<?> x, Object y);
Predicate and(Predicate... restrictions);
Predicate or(Expression<Boolean> x, Expression<Boolean> y);

这里 Expression 对象通过 root 获取, 在查询的时候 expression 会转成 hql

public Predicate toPredicate(Root<Equipment> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
	Expression expression = root.get("equipmentId").as(String.class)
	criteriaBuilder.equal(expression, "123")
	query.where(expression);
	return query.getRestriction();
}

生成的 hql

SELECT
	generatedAlias0 
FROM
	Equipment AS generatedAlias0 
WHERE
	( generatedAlias0.equipmentId=: param0 ) 

遇到 org.hibernate.QueryException: Expression to CAST cannot be an entity : emequipmen0_.type

如何查询关联对象的条件, 答案是使用 root.get("type").get("typeId")

root 可以当做是一个被查询的对象,root.get 取出指定的属性, 就像取出对象的属性一样, 返回值也是root,也可以用get取属性, 就能得到需要做比较的值了

另外, 使用反射获取对象的属性值,不用一个个调用get

Field field = Equipment.class.getDeclaredField("equipmentId");
// 设置 accessible 访问私有变量
field.setAccessible(true);
field.get(queryParam);

参考:

转载于:https://my.oschina.net/hongdaorong/blog/3025797

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值