【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,后来小伙伴推荐我本书,再接触的时候就有些熟悉了,而且知识更加有体系,常敲代码,多看书,妥了!
- 【JPQL】—查询参数、命名查询和使用构造器查询
- JPQL排序,命名查询,构造器,带参数查询
- JPQL的命名查询@NamedQuery
- JPA的查询语言—JPQL的命名查询@NamedQuery
- JPQL 查询
- JPQL查询
- JPQL查询
- 使用 JPQL 和原生 SQL 查询 JPA 实体
- 使用 JPQL 和原生 SQL 查询 JPA 实体(转)
- EJB3.0 JPQL 查询
- jpql 语句的查询
- JPA JPQL 查询、排序.....
- EJB查询语言--JPQL
- JPA查询语言 JPQL
- JPA JPQL 查询、排序
- JPQL 查询语言
- JPQL多实体查询
- JPA JPQL 查询、排序
- 全球最牛白帽黑客汇聚全民黑客盛会GeekPwn2017
- qnx学习笔记-QNX以太网phy驱动调试AR8035 PHY驱动调试
- 盯盯拍CEO 罗勇现身云栖大会 畅谈车联网生态并发布全新产品mini3
- 阿里云密集发布数款新产品,留给其他玩家的时间还多么?| 云栖大会 2017
- 例题7-14 网格动物(Lattice Animals, ACM/ICPC NEERC 2004, UVa1602)
- 【JPQL】—查询参数、命名查询和使用构造器查询
- bzoj5071: [Lydsy十月月赛]小A的数字
- 【三】机器学习之路——机器学习主要类别
- 数据库中间件 Sharding-JDBC 源码分析 —— 结果归并
- 三款变两款!Google取消代号为muskie的Pixel设备
- 分析师:腾讯财付通支付份额将在2018年超越支付宝
- Uber核心团队濒临瓦解,二把手离职
- 暗云III攻击警报仍未解除,CNCERT发布校园网安全公告
- 苹果更新条款:明确“打赏”须走内购,抽成30%