亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JpaRepository?實現(xiàn)簡單條件查詢

 更新時間:2021年11月25日 10:32:35   作者:云淡風輕58  
這篇文章主要介紹了JpaRepository?實現(xiàn)簡單條件查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

JpaRepository 簡單條件查詢

JpaRepository繼承自PagingAndSortingRepository接口,JpaRepository基于JPA的Repository接口,極大減少了JPA作為數(shù)據(jù)訪問的代碼,JpaRepository是實現(xiàn)Spring Data JPA技術訪問數(shù)據(jù)庫的關鍵接口。

示例:簡單條件查詢

創(chuàng)建持久化類

程序清單:/jpa/src/main/java/com/dwx/bean/User.java

package com.dwx.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer userId;
	private String userName;
	private String sex;
	private Integer age;
	public User() {}
	public User(String userName,String sex,Integer age) {
		this.userName=userName;
		this.sex=sex;
		this.age=age;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

定義數(shù)據(jù)訪問層接口

程序清單:/jpa/src/main/java/com/dwx/repository/UserRepository.java

package com.dwx.repository;
import java.util.List;
 
import org.springframework.data.jpa.repository.JpaRepository;
import com.dwx.bean.User;
public interface UserRepository extends JpaRepository<User, Integer> {
	User findByUserName(String userName);
	List<User> findByUserNameAndAge(String userName,Integer age);
	List<User> findByUserNameLike(String userName);
}

定義業(yè)務層類

程序清單:/jpa/src/main/java/com/dwx/service/UserService.java

package com.dwx.service;
import java.util.List;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.dwx.bean.User;
import com.dwx.repository.UserRepository;
@Service
public class UserService {
	@Resource
	private UserRepository userRepository;
	
	@Transactional
	public void saveAll(List<User> users) {
		userRepository.saveAll(users);
	}
	
	public User getUserByUserName(String userName) {
		return userRepository.findByUserName(userName);
	}
	
	public List<User> getUserByUserNameAndAge(String userName,Integer age){
		return userRepository.findByUserNameAndAge(userName, age);
	}
	
	public List<User> getUserByUserNameLike(String userName){
		return userRepository.findByUserNameLike(userName);
	}
}

定義控制器類

程序清單:/jpa/src/main/java/com/dwx/controller/UserController.java

package com.dwx.controller;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.dwx.bean.User;
import com.dwx.service.UserService;
@RestController
@RequestMapping("/user")
public class UserController {
	@Resource
	private UserService userService;
	
	@RequestMapping("/save")
	public String save() {
		User user1=new User("john","男",25);
		User user2=new User("lucy","女",18);
		User user3=new User("Tom","男",16);
		List<User> users=new ArrayList<>();
		users.add(user1);
		users.add(user2);
		users.add(user3);
		userService.saveAll(users);
		return "保存成功";
	}
	
	@RequestMapping("/userName")
	public User getByUserName(String userName){
		return userService.getUserByUserName(userName);
	}
	
	@RequestMapping("/userNameAndAge")
	public List<User> getByUserNameAndAge(String userName,Integer age){
		return userService.getUserByUserNameAndAge(userName, age);
	}
	
	@RequestMapping("/userNameLike")
	public List<User> getByUserNameLike(String userName){
		return userService.getUserByUserNameLike(userName);
	}
}

測試應用

添加用戶信息,在瀏覽器中輸入以下地址:http://localhost:8080/user/save

根據(jù)姓名和年齡查詢,在瀏覽器中輸入以下地址:http://localhost:8080/user/userNameAndAge?userName=john&age=25

根據(jù)姓名模糊查詢,在瀏覽器中輸入以下地址:http://localhost:8080/user/userNameLike?userName=jack

JpaRepository 查詢規(guī)范

1.JpaRepository支持接口規(guī)范方法名查詢

意思是如果在接口中定義的查詢方法符合它的命名規(guī)則,就可以不用寫實現(xiàn),目前支持的關鍵字如下。

Keyword

Sample

JPQL snippet

IsNotNull

findByAgeNotNull

... where x.age not null

Like

findByNameLike

... where x.name like ?1

NotLike

findByNameNotLike

... where x.name not like ?1

StartingWith

findByNameStartingWith

... where x.name like ?1(parameter bound with appended %)

EndingWith

findByNameEndingWith

... where x.name like ?1(parameter bound with prepended %)

Containing

findByNameContaining

... where x.name like ?1(parameter bound wrapped in %)

OrderBy

findByAgeOrderByName

... where x.age = ?1 order by x.name desc

Not

findByNameNot

... where x.name <> ?1

In

findByAgeIn

... where x.age in ?1

NotIn

findByAgeNotIn

... where x.age not in ?1

True

findByActiveTrue

... where x.avtive = true

Flase

findByActiveFalse

... where x.active = false

And

findByNameAndAge

... where x.name = ?1 and x.age = ?2

Or

findByNameOrAge

... where x.name = ?1 or x.age = ?2

Between

findBtAgeBetween

... where x.age between ?1 and ?2

LessThan

findByAgeLessThan

... where x.age < ?1

GreaterThan

findByAgeGreaterThan

... where x.age > ?1

After/Before

...

...

IsNull

findByAgeIsNull

... where x.age is null

2.JpaRepository相關查詢功能

a.Spring DataJPA框架在進行方法名解析時

會先把方法名多余的前綴截取掉,比如find、findBy、read、readBy、get、getBy,然后對剩下部分進行解析。

b.假如創(chuàng)建如下的查詢

findByUserDepUuid(),框架在解析該方法時,首先剔除findBy,然后對剩下的屬性進行解析,假設查詢實體為Doc。

1:先判斷userDepUuid (根據(jù)POJO規(guī)范,首字母變?yōu)樾懀┦欠駷椴樵儗嶓w的一個屬性,如果是,則表示根據(jù)該屬性進行查詢;如果沒有該屬性,繼續(xù)第二步;

2:從右往左截取第一個大寫字母開頭的字符串此處為Uuid),然后檢查剩下的字符串是否為查詢實體的一個屬性,如果是,則表示根據(jù)該屬性進行查詢;如果沒有該屬性,則重復第二步,繼續(xù)從右往左截??;最后假設user為查詢實體的一個屬性;

3:接著處理剩下部分(DepUuid),先判斷user所對應的類型是否有depUuid屬性,如果有,則表示該方法最終是根據(jù)“Doc.user.depUuid” 的取值進行查詢;否則繼續(xù)按照步驟2的規(guī)則從右往左截取,最終表示根據(jù)“Doc.user.dep.uuid” 的值進行查詢。

4:可能會存在一種特殊情況,比如Doc包含一個user的屬性,也有一個userDep 屬性,此時會存在混淆。可以明確在屬性之間加上"_"以顯式表達意圖,比如"findByUser_DepUuid()"或者"findByUserDep_uuid()"

c.特殊的參數(shù)

還可以直接在方法的參數(shù)上加入分頁或排序的參數(shù),比如:

Page<UserModel>findByName(String name, Pageable pageable);
List<UserModel>findByName(String name, Sort sort);

d.也可以使用JPA的NamedQueries,方法如下

1:在實體類上使用@NamedQuery,示例如下:

@NamedQuery(name ="UserModel.findByAge",query = "select o from UserModel o where o.age >=?1")

2:在自己實現(xiàn)的DAO的Repository接口里面定義一個同名的方法,示例如下:

publicList<UserModel> findByAge(int age);

3:然后就可以使用了,Spring會先找是否有同名的NamedQuery,如果有,那么就不會按照接口定義的方法來解析。

e.還可以使用@Query來指定本地查詢

只要設置nativeQuery為true,比如:

@Query(value="select* from tbl_user where name like %?1" ,nativeQuery=true)
publicList<UserModel> findByUuidOrAge(String name);

注意:當前版本的本地查詢不支持翻頁和動態(tài)的排序

f.使用命名化參數(shù)

使用@Param即可,比如:

@Query(value="selecto from UserModel o where o.name like %:nn")
publicList<UserModel> findByUuidOrAge(@Param("nn") String name);

g.同樣支持更新類的Query語句

添加@Modifying即可,比如:

@Modifying
@Query(value="updateUserModel o set o.name=:newName where o.name like %:nn")
public intfindByUuidOrAge(@Param("nn") String name,@Param("newName")String
newName);

注意:

1:方法的返回值應該是int,表示更新語句所影響的行數(shù)

2:在調用的地方必須加事務,沒有事務不能正常執(zhí)行

h.創(chuàng)建查詢的順序

Spring Data JPA在為接口創(chuàng)建代理對象時,如果發(fā)現(xiàn)同時存在多種上述情況可用,它該優(yōu)先采用哪種策略呢?

<jpa:repositories>提供了query-lookup-strategy 屬性,用以指定查找的順序。

它有如下三個取值:

1:create-if-not-found:如果方法通過@Query指定了查詢語句,則使用該語句實現(xiàn)查詢;如果沒有,則查找是否定義了符合條件的命名查詢,如果找到,則使用該命名查詢;如果兩者都沒有找到,則通過解析方法名字來創(chuàng)建查詢。這是querylookup-strategy 屬性的默認值

2:create:通過解析方法名字來創(chuàng)建查詢。即使有符合的命名查詢,或者方法通過@Query指定的查詢語句,都將會被忽略

3:use-declared-query:如果方法通過@Query指定了查詢語句,則使用該語句實現(xiàn)查詢;如果沒有,則查找是否定義了符合條件的命名查詢,如果找到,則使用該命名查詢;如果兩者都沒有找到,則拋出異常

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

相關文章

最新評論