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

前言

    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.Date
Query setParameter(String name,java.util.Date value,TemporalType temporalType);
//命名参数查询时使用,参数类型java.util.Calendar
Query setParameter(String name,Calendar value,TemporalType temporalType);
//位置参数查询时使用,参数类型为java.util.Date
Query setParameter(int position,Date value,TemporalType temporalType);
//位置参数查询时使用,参数类型为java.util.Calendar
Query 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 的构造器参数,并产生实体作为结果返回 。如果我们想要获取两张表的部分属性,我们可以用一个类来包装它,这就要用到构造器。

//包装一个新类,提供以需要属性为参数的构造方法
@Entity
public 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,后来小伙伴推荐我本书,再接触的时候就有些熟悉了,而且知识更加有体系,常敲代码,多看书,妥了!

评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值