Spring Boot 3 與 Hibernate JPA 教學(四) Repository 增加查詢或異動功能

Spring Boot 3 與 Hibernate JPA 使用 Repository ,有基本的功能,如果要依照需求,增加其他功能該怎麼做呢?

Spring Data JPA 官方文件

Hibernate JPA 自定義查詢方法

可以在 method 的名稱上面使用 Spring data Jpa 已經定義好的名詞,來到效果。

資料相同的比較

在 MyBookDao.java 中,增加 mehod

package com.example.myjpa.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.myjpa.entity.MyBook;

@Repository
public interface MyBookDao  extends JpaRepository<MyBook, Long>{
	
	MyBook findByName(String name);

}

並在 MyBookAction.java 中增加 method

@GetMapping("queryByBookName")
	public Map queryByBookName() {
		Map rs = new HashMap();
		MyBook book =  myBookDao.findByName("第一本書");
		MyBookVo vo = new MyBookVo();
		BeanUtils.copyProperties(book, vo);//複製資料
		rs.put("success", true);
		rs.put("book", vo);
		return rs;
	}

如果資料庫是空的,請先新增資料。

於瀏覽器上執行: http://localhost:8080/MyBook/insert

進行查詢

於瀏覽器上執行: http://localhost:8080/MyBook/queryByBookName

資料庫中資料

資料範圍的查詢

先新增多筆不同的資料,如下:

在 MyBookDao.java 中,增加 mehod

    List<MyBook> findByPriceGreaterThanEqual(int from);
	
    List<MyBook> findByPriceLessThanEqual(int to);

並在 MyBookAction.java 中增加 method

@GetMapping("queryMore300")
	public Map queryMore300() {
		Map rs = new HashMap();
		
		List<MyBook> list=myBookDao.findByPriceGreaterThanEqual(300);
		List<MyBookVo> listVo = new ArrayList<>();
		for(MyBook book:list) {
			MyBookVo vo = new MyBookVo();
			BeanUtils.copyProperties(book, vo);//複製資廖
			listVo.add(vo);
		}
		
		rs.put("success", true);
		rs.put("book", listVo);
		return rs;
	}

於瀏覽器上執行: http://localhost:8080/MyBook/queryByBookName

可以查出,價格大於等於 300 的資料。

多種條件組合

SQL 的 where 當有多種條件時,可以用 and , or 進行條件的組合。

在 MyBookDao.java 中,增加 mehod

List<MyBook> findByPriceLessThanEqualAndNameLike(int price , String name);

並在 MyBookAction.java 中增加 method

@GetMapping("queryLess200name")
	public Map queryLess200name() {
		Map rs = new HashMap();
		
		List<MyBook> list=myBookDao.findByPriceLessThanEqualAndNameLike(200, "%書2%");
		List<MyBookVo> listVo = new ArrayList<>();
		for(MyBook book:list) {
			MyBookVo vo = new MyBookVo();
			BeanUtils.copyProperties(book, vo);//複製資廖
			listVo.add(vo);
		}
		
		rs.put("success", true);
		rs.put("book", listVo);
		return rs;
	}

於瀏覽器上執行: http://localhost:8080/MyBook/queryByBookName

使用原生的SQL

也可以使用原生的 SQL 語法來查詢

在 MyBookDao.java 中,增加 mehod

@Query(
            nativeQuery = true,
            value = """
                SELECT *
                FROM `mybook`
                WHERE `name` = ?1 OR `publishing_House` = ?2
            """
    )
    List<MyBook> findByTwoName(String name, String publishingHouse);

並在 MyBookAction.java 中增加 method

	@GetMapping("queryTwoname")
	public Map queryTwoname() {
		Map rs = new HashMap();
		
		List<MyBook> list=myBookDao.findByTwoName("第一本書3", "低一出版社");
		List<MyBookVo> listVo = new ArrayList<>();
		for(MyBook book:list) {
			MyBookVo vo = new MyBookVo();
			BeanUtils.copyProperties(book, vo);//複製資廖
			listVo.add(vo);
		}
		
		rs.put("success", true);
		rs.put("book", listVo);
		return rs;
	}

於瀏覽器上執行: http://localhost:8080/MyBook/queryTwoname