【JPQL】—查询参数、命名查询和使用构造器查询

来源:互联网 发布:最好听的英文歌知乎 编辑:程序博客网 时间:2024/06/05 19:39

前言

    JPA定义了一套属于面向对象的查询语言:JPQL,它具有良好的移植性。JPA提供了一套功能非常强大的查询体系,它不仅可以使用JPA本身定义的JPQL语句进行查询,还可以利用原生SQL语句进行查询,这样就可以让开发者灵活的利用底层数据库的特性进行查询。下面主要介绍JPQL查询的基础知识。

一、查询语句的参数

    JPQL语句支持两种方式的参数定义方式:命名参数和位置参数。
    在同一个查询语句中只允许使用同一种参数定义方式。

命名参数

    格式:“:+ 参数名”
    示例:

Query query =em.createQuery("select u from User u where u.userid =:param ");//设置参数query.setParameter("param",25);

位置参数

    格式:“?+ 位置编号”
    示例:

Query query = em.createQuery("select u from User u where  u.userid=?1")query.setParameter(1,25);

    如果需要传递java.util.Date或java.util.Calendar参数查询,需要使用一个特殊的setParameter()方法,相关的setParameter()方法定义如下:

public interface Query{//命名参数查询时使用,参数类型为java.util.DateQuery setParameter(String name,java.util.Date value,TemporalType temporalType);//命名参数查询时使用,参数类型java.util.CalendarQuery setParameter(String name,Calendar value,TemporalType temporalType);//位置参数查询时使用,参数类型为java.util.DateQuery setParameter(int position,Date value,TemporalType temporalType);//位置参数查询时使用,参数类型为java.util.CalendarQuery setParameter(int position,Calendar value,TemporalType temporalType);}

二、命名查询

    JPA查询API支持两种查询类型:命名查询和动态查询。命名查询的目的是存储和重用。如果希望用户输入一些条件动态创建查询语句,就要使用动态查询,动态查询时在运行时创建的。
    命名查询就是给经常使用的查询语句起个名字,适合应用程序在几个地方都调用这个查询的情况,做到了代码的复用。
    在实体中使用@NamedQuery 或者 @NamedQueries 预先定义一个或多个查询语句

//定义单个查询语句@NamedQuery(name="getBook",query="SELECT o FROM TBook o WHERE o.id=:bookId and o.isDelete=0")@Entity@Table(name = "t_book")public class TBook extends AbstractAuditingEntity implements Serializable{//定义多个查询语句@NamedQueries({@NamedQuery(name="getBook",query="SELECT c FROM TBook c WHERE c.id=:bookId and c.isDelete=0"),        @NamedQuery(name="TBook.getBookTypeId",query="SELECT a FROM TBook a WHERE a.id=:BookId and a.isDelete=0")})

    定义好命名查询之后,我们通过名称执行查询:

//根据bookid查到book表信息public List<TBook> getBook (String bookId){  TypedQuery<TBook> query =            em.createNamedQuery("getBook", TBook.class);     query.setParameter("bookId", bookId);return query.getResultList();    }

三、查询中使用构造器

    JPQL 支持将查询的属性结果直接作为一个 java class 的构造器参数,并产生实体作为结果返回 。如果我们想要获取两张表的部分属性,我们可以用一个类来包装它,这就要用到构造器。

//包装一个新类,提供以需要属性为参数的构造方法@Entitypublic class TBook1 implements Serializable {    //定义一个无参的构造函数    public TBook1(){    }    //定义有参的构造函数    public TBook1(String id,String searchNum,String isbn,String bookName ){     this.id=id;     this.searchNum=searchNum;     this.isbn=isbn;     this.bookName=bookName;}//定义主键 @Id   private String id = null;  private String searchNum = null;  private String isbn = null;  private String bookName = null;  //getter和setter定义属性  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }   public String getSearchNum() {    return searchNum;  }  public void setSearchNum(String searchNum) {    this.searchNum = searchNum;     ……  }  

    查询代码:

//把需要的三个属性作为TBook1 的构造函数,并使用new函数Query query = em.createQuery("SELECT new com.dmsdbj.library.entity.TBook1(c.id,c.searchNum,b.isbn,b.name) FROM TBookBasic b,TBook c WHERE b.id=c.basicId and c.isDelete=0 and b.isDelete=0");

    注意:返回的新实体TBook1使用时要添加全路径

总结

    最近学习的JPQL查询就是这些,初次学习是找的网上的demo,后来小伙伴推荐我本书,再接触的时候就有些熟悉了,而且知识更加有体系,常敲代码,多看书,妥了!