欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JPA在不寫sql的情況下如何實現(xiàn)模糊查詢

 更新時間:2024年11月20日 15:14:22   作者:武梓龍_Wzill  
文章介紹了在項目中實現(xiàn)模糊查詢的幾種方法,包括使用JPA的API、JPQL、QueryByExample和@Query注解,通過實現(xiàn)Specification接口和定義接口繼承JpaRepository,可以方便地進(jìn)行單字段和多字段的模糊查詢,文章還提到了BINARY函數(shù)的使用以及查詢結(jié)果的返回

背景介紹

在我們的項目中很多的業(yè)務(wù)都會設(shè)計模糊查詢,例如按照姓氏去獲取人員的信息,按照手機號的前三位去獲取人員的信息等。

我們除了正常的手寫模糊查詢的sql語句去獲取信息之外,還可以使用JPA自帶的API來實現(xiàn)任意字段的模糊查詢。

JPA已經(jīng)給我們封裝好了。當(dāng)我們對模糊查詢非常熟悉了之后直接拿來時候即可。

概念說明

單字段模糊匹配

  • 說明:在一個字段中無論關(guān)鍵字出現(xiàn)在什么位置上,只要有關(guān)鍵詞即可。
  • 場景:獲取手機號開頭為187的學(xué)生
  • 應(yīng)用:
SELECT*FROM table_name WHERE BINARY column_name LIKE'%keyword%';

多字段模糊匹配:

  • 說明:在多個字段中無論關(guān)鍵字出現(xiàn)在什么位置上,只要每個字段有每個字段指定的關(guān)鍵詞即可。
  • 場景:獲取手機號開頭為187并且姓氏為武的學(xué)生
  • 應(yīng)用:
SELECT*FROM table_name WHERE BINARY column1_name LIKE'%keyword1%'AND column2_name LIKE'%keyword2%';

注:

  • BINARY函數(shù)是開啟大小寫敏感的函數(shù),底層邏輯是通過Ascii碼的方式比較的。
  • 因為數(shù)據(jù)庫默認(rèn)是對大小寫不敏感的,也就是我們在查詢名稱為wzl數(shù)據(jù)的時候,也會把名稱為Wzl的數(shù)據(jù)也查詢出來。

實現(xiàn)過程

代碼實現(xiàn)

1.寫一個實體類去實現(xiàn)Specification接口,重寫toPredicate方法

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.tfjybj.dao.UserDao;
import com.tfjybj.utils.SnowflakeIdWorker;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @BelongsProject: incentive
 * @BelongsPackage: com.tfjybj.service
 * @Author: Wuzilong
 * @Description: 描述什么人干什么事兒
 * @CreateTime: 2023-08-28 14:48
 * @Version: 1.0
 */
@Table
@Entity
@Service
@Data
public class User implements Specification<User> {

    @Id
    @JsonSerialize(using = com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
    private Long id;

    private String account;

    private  String password;

    private String phone;

    private Date createTime;

    private Date updateTime;

    private Integer isDelete;

    @Resource
    @Transient
    private UserDao userDao;

    @Override
    public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
        List<String> nonNullFields = new ArrayList<>();
        Field[] declaredFields = this.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            try {
                Object value = field.get(this);
                if (value != null) {
                    nonNullFields.add(field.getName());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        Predicate[] predicates = new Predicate[nonNullFields.size()+1];

        for (int i = 0; i < nonNullFields.size(); i++) {
            try {
                predicates[i] = criteriaBuilder.like(root.get(nonNullFields.get(i)), "%" + this.getClass().getDeclaredField(nonNullFields.get(i)).get(this) + "%");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 添加額外的條件,排除isdelete=1的數(shù)據(jù)
        predicates[nonNullFields.size()] = criteriaBuilder.notEqual(root.get("isDelete"), 1);

        return criteriaBuilder.and(predicates);
    }
}

本文中實現(xiàn)的是and方式的模糊查詢,也可是使用or的方式進(jìn)行模糊查詢,也就是多個字段中都包含一個關(guān)鍵字。

2.定義一個接口去繼承JpaRepository接口,并指定返回的類型和參數(shù)類型

@Entity
import com.tfjybj.service.User;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @BelongsProject: incentive
 * @BelongsPackage: com.tfjybj.dao
 * @Author: Wuzilong
 * @Description: 描述什么人干什么事兒
 * @CreateTime: 2023-08-28 14:48
 * @Version: 1.0
 */
@Repository
public interface UserDao extends JpaRepository<User, Long> {

    List<User> findAll(Specification<User> userInfo);
}

3.在業(yè)務(wù)類中調(diào)用聲明的接口

@Entity
    public List<User> selectToFuzzy(User userInfo){
        List<User> userInfoList = userDao.findAll(userInfo);
        return userInfoList;
    }

4.在Controller中直接調(diào)用業(yè)務(wù)類中的方法即可

    @RequestMapping(value="selectToFuzzy",method= RequestMethod.POST)
    //模糊查詢用戶的信息
    public List<User> selectToFuzzy(@RequestBody User userInfo){
        List<User> users = user.selectToFuzzy(userInfo);
        return users;
    }

執(zhí)行結(jié)果

可以看到我們的入?yún)⒍际菍?yīng)字段值的一部分內(nèi)容,phone字段傳入的是187它會把phone字段中包含187的所有數(shù)據(jù)都返回 回來。

同樣兩個字段一起模糊查詢也是一樣。

其他方式

1.使用JPQL進(jìn)行模糊查詢

使用LIKE關(guān)鍵字結(jié)合通配符(%)進(jìn)行模糊匹配。

例如:

SELECT e FROM Employee e WHERE e.name LIKE '%John%'

2.使用Spring Data JPA的Query By Example進(jìn)行模糊查詢

創(chuàng)建一個實體對象作為查詢條件,設(shè)置需要模糊匹配的屬性值。

例如:

ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("name", match -> match.contains()); Example<Employee> example = Example.of(employee, matcher);

3.使用Spring Data JPA的@Query注解進(jìn)行模糊查詢

在Repository接口中使用@Query注解定義自定義的查詢方法。

在查詢方法中使用%通配符進(jìn)行模糊匹配。

例如:

@Query("SELECT e FROM Employee e WHERE e.name LIKE %?1%") List<Employee> findByName(String name);

總結(jié)提升

根據(jù)自己的業(yè)務(wù)需求去選擇使用哪一種模糊查詢的方式。底層原理都是一樣的。

JPA封裝了一些公共的內(nèi)容,我們開發(fā)的過程中使用起來就比較容易和簡單。

但是我們在使用的過程中也要明白底層是如何實現(xiàn),不能只停留在會使用的階段中。知其然也要知其所以然。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中常用修飾符的使用方法匯總

    Java中常用修飾符的使用方法匯總

    下面小編就為大家?guī)硪黄狫ava中常用修飾符的使用方法匯總。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解Java編程中線程同步以及定時啟動線程的方法

    詳解Java編程中線程同步以及定時啟動線程的方法

    這篇文章主要介紹了詳解Java編程中線程同步以及定時啟動線程的方法, 講到了wait()與notify()方法以及阻塞隊列等知識,需要的朋友可以參考下
    2016-01-01
  • springboot vue完成發(fā)送接口請求顯示響應(yīng)頭信息

    springboot vue完成發(fā)送接口請求顯示響應(yīng)頭信息

    這篇文章主要為大家介紹了springboot+vue完成發(fā)送接口請求顯示響應(yīng)頭信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java實現(xiàn)自定義語言和表達(dá)式解析的解釋器模式

    Java實現(xiàn)自定義語言和表達(dá)式解析的解釋器模式

    Java解釋器設(shè)計模式通過解析自定義語言和表達(dá)式,實現(xiàn)對復(fù)雜邏輯的處理,提高程序可擴(kuò)展性和靈活性。它將語法解析和執(zhí)行過程分離,通過抽象語法樹和解釋器實現(xiàn)對語言和表達(dá)式的解析和求值,避免了硬編碼和復(fù)雜的條件判斷,提高了程序的可讀性和可維護(hù)性
    2023-04-04
  • 關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表

    關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表

    這篇文章主要介紹了關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • 手把手教你如何在Idea中下載jar包

    手把手教你如何在Idea中下載jar包

    maven依賴的jar包,很多時候同一個jar包會存在多個版本,刪除其中一個后,重新編譯,會把舊jar由加載回來了,下面這篇文章主要給大家介紹了關(guān)于如何在Idea中下載jar包的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • MybatisPlus實現(xiàn)簡單增刪改查功能

    MybatisPlus實現(xiàn)簡單增刪改查功能

    這篇文章主要介紹了MybatisPlus實現(xiàn)簡單增刪改查的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java設(shè)計模式之中介者模式

    Java設(shè)計模式之中介者模式

    這篇文章介紹了Java設(shè)計模式之中介者模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    本文主要介紹了java利用url實現(xiàn)網(wǎng)頁內(nèi)容抓取的示例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Alibaba?Fastjson之超好用的JOSN解析庫

    Alibaba?Fastjson之超好用的JOSN解析庫

    這篇文章主要介紹了Alibaba?Fastjson之超好用的JOSN解析庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論