V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rainbowyao
V2EX  ›  Java

SpringDataJPA @Query 动态参数

  •  
  •   rainbowyao · 2020-05-30 08:18:59 +08:00 · 5385 次点击
    这是一个创建于 1671 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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?

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

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

    用 mybatis 不也得拼 sql 嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2846 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:57 · PVG 22:57 · LAX 06:57 · JFK 09:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.