spring boot jpa之命名查詢
阿新 • • 發佈:2018-10-31
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將嘗試將對這些方法的呼叫解析為命名查詢,從配置的域類的簡單名稱開始,後跟由點分隔的方法名稱。因此,此處的示例將使用上面定義的命名查詢,而不是嘗試從方法名稱建立查詢。