最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JpaRepository?實(shí)現(xiàn)簡(jiǎn)單條件查詢(xún)

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

JpaRepository 簡(jiǎn)單條件查詢(xún)

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

示例:簡(jiǎn)單條件查詢(xún)

創(chuàng)建持久化類(lèi)

程序清單:/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ù)訪問(wèn)層接口

程序清單:/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è)務(wù)層類(lèi)

程序清單:/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);
	}
}

定義控制器類(lèi)

程序清單:/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);
	}
}

測(cè)試應(yīng)用

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

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

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

JpaRepository 查詢(xún)規(guī)范

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

意思是如果在接口中定義的查詢(xún)方法符合它的命名規(guī)則,就可以不用寫(xiě)實(shí)現(xiàn),目前支持的關(guā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相關(guān)查詢(xún)功能

a.Spring DataJPA框架在進(jìn)行方法名解析時(shí)

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

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

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

1:先判斷userDepUuid (根據(jù)POJO規(guī)范,首字母變?yōu)樾?xiě))是否為查詢(xún)實(shí)體的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢(xún);如果沒(méi)有該屬性,繼續(xù)第二步;

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

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

4:可能會(huì)存在一種特殊情況,比如Doc包含一個(gè)user的屬性,也有一個(gè)userDep 屬性,此時(shí)會(huì)存在混淆??梢悦鞔_在屬性之間加上"_"以顯式表達(dá)意圖,比如"findByUser_DepUuid()"或者"findByUserDep_uuid()"

c.特殊的參數(shù)

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

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

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

1:在實(shí)體類(lèi)上使用@NamedQuery,示例如下:

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

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

publicList<UserModel> findByAge(int age);

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

e.還可以使用@Query來(lái)指定本地查詢(xún)

只要設(shè)置nativeQuery為true,比如:

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

注意:當(dāng)前版本的本地查詢(xún)不支持翻頁(yè)和動(dòng)態(tài)的排序

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

使用@Param即可,比如:

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

g.同樣支持更新類(lèi)的Query語(yǔ)句

添加@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:方法的返回值應(yīng)該是int,表示更新語(yǔ)句所影響的行數(shù)

2:在調(diào)用的地方必須加事務(wù),沒(méi)有事務(wù)不能正常執(zhí)行

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

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

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

它有如下三個(gè)取值:

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

2:create:通過(guò)解析方法名字來(lái)創(chuàng)建查詢(xún)。即使有符合的命名查詢(xún),或者方法通過(guò)@Query指定的查詢(xún)語(yǔ)句,都將會(huì)被忽略

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

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

相關(guān)文章

  • Mybatis-plus設(shè)置某個(gè)字段值為null的方法總結(jié)

    Mybatis-plus設(shè)置某個(gè)字段值為null的方法總結(jié)

    mybatis-plus以下簡(jiǎn)稱(chēng)mp,目前應(yīng)該也算是主流的一款數(shù)據(jù)訪問(wèn)層應(yīng)用框架,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus設(shè)置某個(gè)字段值為null的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 在Java中使用下劃線分隔數(shù)的字面值的用法講解

    在Java中使用下劃線分隔數(shù)的字面值的用法講解

    這篇文章主要介紹了在Java中使用下劃線分隔數(shù)字的字面值的用法講解,這是Java7以后加入的新特性,需要的朋友可以參考下
    2016-03-03
  • Java實(shí)現(xiàn)簡(jiǎn)單文字驗(yàn)證碼以及人機(jī)驗(yàn)證

    Java實(shí)現(xiàn)簡(jiǎn)單文字驗(yàn)證碼以及人機(jī)驗(yàn)證

    人機(jī)驗(yàn)證技術(shù)的發(fā)展也在不斷進(jìn)化,從最初的簡(jiǎn)單驗(yàn)證碼到現(xiàn)在的人工智能驅(qū)動(dòng)的高級(jí)驗(yàn)證系統(tǒng),下面這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單文字驗(yàn)證碼以及人機(jī)驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • Java實(shí)現(xiàn)爬蟲(chóng)給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲(chóng))

    Java實(shí)現(xiàn)爬蟲(chóng)給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲(chóng))

    這篇文章主要介紹了Java實(shí)現(xiàn)爬蟲(chóng)給App提供數(shù)據(jù),即Jsoup 網(wǎng)絡(luò)爬蟲(chóng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Java獲取視頻時(shí)長(zhǎng)、大小的示例

    Java獲取視頻時(shí)長(zhǎng)、大小的示例

    這篇文章主要介紹了Java獲取視頻時(shí)長(zhǎng)、大小的示例,幫助大家利用Java處理視頻,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • Spring@Value使用獲取配置信息為null的操作

    Spring@Value使用獲取配置信息為null的操作

    這篇文章主要介紹了Spring@Value使用獲取配置信息為null的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺談mybatis-plus批量保存異常及效率優(yōu)化

    淺談mybatis-plus批量保存異常及效率優(yōu)化

    本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • mybatis根據(jù)表逆向自動(dòng)化生成代碼的實(shí)現(xiàn)

    mybatis根據(jù)表逆向自動(dòng)化生成代碼的實(shí)現(xiàn)

    若采用mybatis框架,數(shù)據(jù)庫(kù)新建表,手動(dòng)編寫(xiě)的話(huà),需要編寫(xiě)大量的實(shí)體類(lèi)、mapper文件、mapper.xml文件,都是一些重復(fù)且有規(guī)律的工作。我們可以引用插件,然后做配置,自動(dòng)生成這些文件,本文就來(lái)詳細(xì)的介紹一下
    2021-08-08
  • Java 泛型有哪些好處詳解

    Java 泛型有哪些好處詳解

    這篇文章主要介紹了 Java 泛型有哪些好處詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 10個(gè)經(jīng)典的Java main方法面試題

    10個(gè)經(jīng)典的Java main方法面試題

    這篇文章主要為大家分享了10個(gè)經(jīng)典的Java main方法面試題,與其說(shuō)是Java面試題,其實(shí)也是Java的一些最基礎(chǔ)知識(shí)問(wèn)題,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論

浦江县| 石阡县| 乌兰察布市| 济宁市| 孟连| 博兴县| 六枝特区| 房山区| 芮城县| 丹东市| 灌云县| 南雄市| 比如县| 荥经县| 琼海市| 祁阳县| 洞头县| 临江市| 奈曼旗| 探索| 水富县| 华坪县| 图木舒克市| 黄平县| 金乡县| 河池市| 临颍县| 双城市| 新丰县| 望谟县| 德惠市| 苍溪县| 寿阳县| 太湖县| 甘洛县| 天津市| 上饶市| 阳春市| 马山县| 乐山市| 湖州市|