1. 程式人生 > >09)SpringBoot 資料操作03-> JPA查詢方法的規則定義

09)SpringBoot 資料操作03-> JPA查詢方法的規則定義

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);
}

關注公眾號,將會有更多精彩每天送達:

公眾號內有精彩內容,可以提現