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?
1
lpd0155 2020-05-30 08:20:20 +08:00 via Android
动态就 M
|
2
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 |
3
hantsy 2020-05-30 08:38:35 +08:00
字符型 SQL 语句在项目中很难维护,type safe 在我以前很多项目中是基本要求。纯的 Type safe SQL 可以考虑 JOOQ 。
|
4
rainbowyao OP @hantsy 感谢,我学习学习
|
5
hantsy 2020-05-30 08:46:30 +08:00
一直不明白的是为什么 V 看到不止一次,用 JPA Query 还要用 Native Query,用 Native Query 你不如直接用 Jdbc 啦。
|
6
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); |
7
running17 2020-05-30 09:55:31 +08:00
这种非复杂的查询建议直接 querydsl 一把梭
|
8
hodur 2020-05-30 11:12:55 +08:00
sql 里面可以 if else 的
|
9
securityCoding 2020-05-30 11:14:17 +08:00
@hantsy 单表查询用原生 sql 纯属调试方便...
|
10
huntcool001 2020-05-30 13:30:44 +08:00
国内的公司好像用 JPA 的比较少? 我发现国内大部分是 Mybatis, 国外是 Hibernate 一类的 ORM, 不知道为什么会这样
|
11
richard1122 2020-05-30 15:57:12 +08:00
一般如果组合情况不是特别多的话还是建议用 spring data jpa 写两个查询
|
12
aragakiyuii 2020-05-30 23:41:48 +08:00
Querydsl
1. repository 继承 QuerydslPredicateExecutor,然后用 BooleanBuilder 拼条件 2. JPAQueryFactory 写 dsl 用 mybatis 不也得拼 sql 嘛? |