SpringDataJPA @Query 动态参数

2020-05-30 08:18:59 +08:00
 rainbowyao

select u.id,u.name,c.companyName from user u left join comapny c on u.company_id = u.id where u.name like '%:1%' and c.company_id = 1 List<User> query(String name)

使用 JPA @Query nativeQuery 的时候如何动态传递参数 name?。name 参数为空的时候,不执行 u.name like 这个查询条件。不使用 JpaSpecificatonExecutor 是因为真实的业务 sql 比这个复杂的更多,上述只是举例。 是不是更合适使用 Mybatis?

5175 次点击
所在节点    Java
12 条回复
lpd0155
2020-05-30 08:20:20 +08:00
动态就 M
hantsy
2020-05-30 08:36:03 +08:00
@rainbowyao Quarkus 下的 Hibernate Pachane 支持这种语法。

JPA 很容易用 Criteria API 自己构建逻辑复杂的查询,Spring Data JPA 添加 Specificaiton 简化操作。

https://github.com/hantsy/spring4-sandbox/blob/master/data-jpa/src/main/java/com/hantsylabs/example/spring/jpa/spec/JpaSpecs.java

如果熟悉 QueryDSL,Sprng Data JPA 也有集成。

https://github.com/hantsy/spring4-sandbox/blob/master/data-jpa/src/main/java/com/hantsylabs/example/spring/jpa/spec/QueryDslPredicates.java
hantsy
2020-05-30 08:38:35 +08:00
字符型 SQL 语句在项目中很难维护,type safe 在我以前很多项目中是基本要求。纯的 Type safe SQL 可以考虑 JOOQ 。
rainbowyao
2020-05-30 08:40:24 +08:00
@hantsy 感谢,我学习学习
hantsy
2020-05-30 08:46:30 +08:00
一直不明白的是为什么 V 看到不止一次,用 JPA Query 还要用 Native Query,用 Native Query 你不如直接用 Jdbc 啦。
eastflying
2020-05-30 08:51:28 +08:00
where (:name is null or u.name like '%:name%')

如果觉得 Criteria 的语法太繁琐,也可以使用 QueryDSL
类似
BooleanBuilder builder = new BooleanBuilder();
if (!StringUtils.isEmpty(name)) {
builder.and(qUser.name.like("%+name+"%"));
}
userRepository.findAll(builder);
running17
2020-05-30 09:55:31 +08:00
这种非复杂的查询建议直接 querydsl 一把梭
hodur
2020-05-30 11:12:55 +08:00
sql 里面可以 if else 的
securityCoding
2020-05-30 11:14:17 +08:00
@hantsy 单表查询用原生 sql 纯属调试方便...
huntcool001
2020-05-30 13:30:44 +08:00
国内的公司好像用 JPA 的比较少? 我发现国内大部分是 Mybatis, 国外是 Hibernate 一类的 ORM, 不知道为什么会这样
richard1122
2020-05-30 15:57:12 +08:00
一般如果组合情况不是特别多的话还是建议用 spring data jpa 写两个查询
aragakiyuii
2020-05-30 23:41:48 +08:00
Querydsl

1. repository 继承 QuerydslPredicateExecutor,然后用 BooleanBuilder 拼条件
2. JPAQueryFactory 写 dsl

用 mybatis 不也得拼 sql 嘛?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/676869

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX