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