1. 程式人生 > >spring boot jpa之命名查詢

spring boot jpa之命名查詢

JPA的命名查詢實際上就是給查詢語句起個名字,執行查詢的時候就是直接使用起的這個名字,避免重複寫JPQL語句

查詢語句寫在實體中,使得實體看起來變得複雜臃腫。

  1、使用@NamedQuery註解在實體類中定義命名查詢。

     @NamedQuery(name="findAllUser",query="SELECT u FROM User u")

       @NamedQuery中的屬性name指定命名查詢的名稱,query屬性指定命名查詢的語句。

       如果要定義多個命名查詢,需要使用@NamedQueries。

       @NamedQueries({
           @NamedQuery(name="findAllUser",query="SELECT u FROM User u"),
           @NamedQuery(name="findUserWithId",query="SELECT u FROM User u WHERE u.id = ?1"),
           @NamedQuery(name="findUserWithName",query="SELECT u FROM User u WHERE u.name = :name")
      })

  2、定義好命名查詢後,可以使用EntityManager的createNamedQuery方法傳入命名查詢的名稱建立查詢。例如:createNamedQuery("findAllUser");

  3、一個簡單的例子。  

  簡單的User實體:


package com.cndatacom.jpa.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
 
@Entity
@Table(name="t_user")
@NamedQueries({
        @NamedQuery(name="findAllUser",query="SELECT u FROM User u"),
        @NamedQuery(name="findUserWithId",query="SELECT u FROM User u WHERE u.id = ?1"),
        @NamedQuery(name="findUserWithName",query="SELECT u FROM User u WHERE u.name = :name")
         
})
public class User {
     
    /**
     * 主鍵
     */
    @Id
    @GeneratedValue
    private Long id;
     
    /**
     * 名字
     */
    @Column(name="name")
    private String name;
     
    /**
     * 密碼
     */
    @Column(name="password")
    private String password;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
     
}

 

public interface UserRepository extends JpaRepository<User, Long> {

  List<User> findAllUser();//名字和實體中查詢的名字一樣

  User findByEmailAddress(String emailAddress);
}

 Spring Data將嘗試將對這些方法的呼叫解析為命名查詢,從配置的域類的簡單名稱開始,後跟由點分隔的方法名稱。因此,此處的示例將使用上面定義的命名查詢,而不是嘗試從方法名稱建立查詢。