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将尝试将对这些方法的调用解析为命名查询,从配置的域类的简单名称开始,后跟由点分隔的方法名称。因此,此处的示例将使用上面定义的命名查询,而不是尝试从方法名称创建查询。

猜你喜欢

转载自blog.csdn.net/qq_27886997/article/details/82985244
今日推荐