Spring Data JPA 中Repository里的方法查询参数,需要判断是否为空的问题

Duang,最近搭建了一个自己的博客小破站,欢迎各位小伙伴来访吖:

ares-coder-blog-portalhttps://www.ares-stack.cn/blog_service/#/game

问题:

动态查询需要判断参数是否为 null ,在repository里的那样的写法,在网上并没找到真正适用的写法。

package com......pubcascade.repository.dao;

简述:

Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询。

使用@Query注解,这种方式可以直接在Repository里面写sql,但是这种方式的问题就是太麻烦了,而且非常容易出错,扩展性也很差,还不如直接用mybatis。

复杂的查询还是使用其他的方式更好(ExampleCriteria、SpringBoot中的findAll(filterList, sort) 等等)。


解决:

暂时只能使用重载,写两个方法,在业务实现类层调用不同的方法

  1. 一个带where条件 在参数不为空的时候调用;
  2. 另一个不带where条件,在参数为空的时候调用。
    /**
     * 验证第一层级的名称唯一(新增时)
     * @param
     * @return
     */
    @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false")
    PubCascade validateFirstLevel(@Param("linkName") String linkName);

    /**
     * 验证第一层级的名称唯一(编辑时)
     * @param
     * @return
     */
    @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false and p.id <> :id")
    PubCascade validateFirstLevel(@Param("linkName") String linkName,@Param("id") Long id);

网上找到的一种写法(未实践):

可以试一试这里的两种方法:

(1)@Query( value = "SELECT * FROM sys_customer WHERE 1=1 " +
            " AND if(:name!='',name LIKE CONCAT('%',:name,'%'),1=1)",
            nativeQuery = true)

(2)@Query(value = "SELECT * FROM sys_customer WHERE 1=1 "+
            " AND (name LIKE CONCAT('%',:name,'%') OR :name IS NULL )",
            nativeQuery = true)
    List<Customer> findDate(@Param("name") String name);


参考来源:

https://bbs.csdn.net/topics/390968657/

SpringData jpa 实现多条件动态查询,分页功能_billluffy的博客-CSDN博客

Spring-Data-JPA criteria 查询 - 简书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值