09)SpringBoot 資料操作03-> JPA查詢方法的規則定義
阿新 • • 發佈:2018-12-19
1 按照方法命名來進行查詢
package cn.xiangxu.springboot.repository; import cn.xiangxu.springboot.entity.dataObject.Girl; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface GirlRepository extends JpaRepository<Girl, Integer> { // where name like ?% and age < ? public List<Girl> findByNameStartingWithAndAgeLessThan(String name, Integer age); }
弊端:方法名很長而且對於複雜的查詢很難實現
2 利用@Query註解實現複雜查詢
可以利用實體物件進行查詢,也可以利用原生的SQL語句進行查詢;利用原生的SQL語句進行查詢時需要設定nativeQuery的值為True
2.1 利用實體類進行查詢
@Query("select g from Girl g where id = (select max(id) from Girl g1)") // 利用實體類進行查詢,可以用別名代替* Girl findByMaxId();
2.2 利用原生SQL語句進行查詢
@Query(nativeQuery = true, value = "select * from girl g") // 利用原生的SQL進行查詢,不能用別名代替* List<Girl> findAllGirl();
2.3 利用索引引數進行查詢
@Query(nativeQuery = true, value = "select * from girl o where o.girl_id=?1 ") // 索引引數 Girl findOneById(Integer id);
2.4 利用命名引數進行查詢
@Query(value = "select o from Girl o where o.id=:id") // 命名引數 Girl findGirlById02(@Param("id") Integer girlId);
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.data.jpa.repository; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.data.annotation.QueryAnnotation; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @QueryAnnotation @Documented public @interface Query { String value() default ""; String countQuery() default ""; String countProjection() default ""; boolean nativeQuery() default false; String name() default ""; String countName() default ""; }
知識點總彙:點選前往
3 利用@Modifying實現更新操作
在進行更新操作時必須新增這個註解
3.1 不新增該註解時的報錯資訊
3.2 添加了該註解後還是報錯
原因:更新操作需要事務支援
3.3 新增@Transactional註解實現事務支援
注意:@Transactional一般都是放在服務層的相關方法中的
@Transactional @Modifying @Query(value = "update Girl o set o.age = ?2 where o.id = ?1") void updateAgeById(Integer id, Integer age);
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.data.jpa.repository; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Documented public @interface Modifying { boolean clearAutomatically() default false; }
package cn.xiangxu.springboot.repository; import cn.xiangxu.springboot.entity.dataObject.Girl; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; import java.util.List; public interface GirlRepository extends JpaRepository<Girl, Integer> { // where name like ?% and age < ? List<Girl> findByNameStartingWithAndAgeLessThan(String name, Integer age); @Query("select g from Girl g where id = (select max(id) from Girl g1)") // 利用實體類進行查詢,可以用別名代替* Girl findByMaxId(); @Query(nativeQuery = true, value = "select * from girl g") // 利用原生的SQL進行查詢,不能用別名代替* List<Girl> findAllGirl(); @Query(nativeQuery = true, value = "select * from girl o where o.girl_id=?1 ") // 索引引數 Girl findOneById(Integer id); @Query(value = "select o from Girl o where o.id=:id") // 命名引數 Girl findGirlById02(@Param("id") Integer girlId); @Transactional @Modifying @Query(value = "update Girl o set o.age = ?2 where o.id = ?1") void updateAgeById(Integer id, Integer age); }
關注公眾號,將會有更多精彩每天送達:
公眾號內有精彩內容,可以提現