jpa--15.JPQL基本api(创建和查询)

参看易百教程:https://www.yiibai.com/jpa/jpa_jpql.html

 

1      JPQL语言

1.1  概念

JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。

JPQL语言的语句可以是 select 语句、update语句或delete语句,它们都通过 Query 接口封装执行

 

1.2  执行数据库查询方法

Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的createQuerycreate NamedQuery createNativeQuery方法可以获得查询对象,进而可调用 Query 接口的相关方法来执行查询操作。

 

1.3  主要方法

int executeUpdate()

用于执行update或delete语句。

List getResultList()

用于执行select语句并返回结果集实体列表。

Object getSingleResult()

用于执行只返回单个结果实体的select语句。

Query setFirstResult(int startPosition)

用于设置从哪个实体记录开始返回查询结果。

Query setMaxResults(int maxResult)

用于设置返回结果实体的最大数。与setFirstResult结合使用可实现分页查询。

Query setFlushMode(FlushModeType flushMode)

设置查询对象的Flush模式。参数可以取2个枚举值:FlushModeType.AUTO为自动更新数据库记录,FlushMode Type.COMMIT 为直到提交事务时才更新数据库记录。

setHint(String hintName, Object value)

设置与查询对象相关的特定供应商参数或提示信息。参数名及其取值需要参考特定 JPA 实现库提供商的文档。如果第二个参数无效将抛出IllegalArgumentException异常。

setParameter(int position, Object value)

为查询语句的指定位置参数赋值。Position指定参数序号,value 为赋给参数的值。

setParameter(int position, Date d,TemporalType type)

为查询语句的指定位置参数赋 Date 值。Position 指定参数序号,value 为赋给参数的值,temporalType取 TemporalType 的枚举常量,包括 DATE、TIME 及 TIMESTAMP 三个,,用于将 Java 的 Date 型值临时转换为数据库支持的日期时间类型(java.sql.Date、java.sql.Time及java.sql.Timestamp)。

setParameter(int position, Calendar c,TemporalType type)

为查询语句的指定位置参数赋 Calendar值。position 指定参数序号,value 为赋给参数的值,temporalType 的含义及取舍同前。

setParameter(String name, Object value)

为查询语句的指定名称参数赋值。

setParameter(String name, Date d,TemporalType type)

为查询语句的指定名称参数赋 Date 值。用法同前。

setParameter(String name, Calendar c,TemporalType type)

为查询语句的指定名称参数设置Calendar值。name为参数名,其它同前。该方法调用时如果参数位置或参数名不正确,或者所赋的参数值类型不匹配,将抛出 IllegalArgumentException 异常。

 

2      基本查询

2.1  select语句

 

2.2  select-from 子句

Select 用来指定查询返回的结果实体或实体的某些属性,From 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。

如果不希望返回重复实体,可使用关键字distinct 修饰。select、from 都是 JPQL 的关键字,通常全大写或全小写,建议不要大小写混用。

2.3  查询所有实体

查询所有实体的 JPQL 查询字串很简单,例如:

         selecto from Order o 或  select o from Order as o

关键字 as 可以省去。

标识符变量的命名规范与 Java 标识符相同,且区分大小写。

 

调用 EntityManager 的createQuery() 方法可创建查询对象,接着调用 Query 接口的 getResultList() 方法就可获得查询结果集。例如:

 

2.4  where子句

2.4.1  指定查询条件

where子句用于指定查询条件,where跟条件表达式。例:

         selecto from Orders o where o.id = 1

         selecto from Orders o where o.id > 3 and o.confirm = 'true'

         selecto from Orders o where o.address.streetNumber >= 123

 

2.4.2  包含参数(:)的查询

JPQL也支持包含参数的查询,例如:

         selecto from Orders o where o.id = :myId

         selecto from Orders o where o.id = :myId and o.customer = :customerName

 注意:参数名前必须冠以冒号(:),执行查询前须使用Query.setParameter(name, value)方法给参数赋值。

 

2.4.3  ?查询

也可以不使用参数名而使用参数的序号,例如:

select o fromOrder o where o.id = ?1 and o.customer = ?2

其中 ?1 代表第一个参数,?2 代表第一个参数。在执行查询之前需要使用重载方法Query.setParameter(pos, value) 提供参数值

 

2.4.4  运算符

where条件表达式中可用的运算符基本上与SQL一致,包括:

算术运算符:+ - * / +(正) -(负)

关系运算符:== <> > >= < <= between…and like in is null 等

逻辑运算符: and or  not

 

2.5  查询部分属性

2.5.1  返回object

如果只须查询实体的部分属性而不需要返回整个实体。例如:

select o.id, o.customerName,o.address.streetNumber from Order o order by o.id

执行该查询返回的不再是Orders实体集合,而是一个对象数组的集合(Object[]),集合的每个成员为一个对象数组,可通过数组元素访问各个属性。

 

2.5.2  返回实体(单个实体)

 

3      创建查询三个方法

3.1  createQuery

3.1.1  查询所有

@Test
   public void testHelloJPQL(){
      Stringjpql= "FROM Customer c WHERE c.age >?";
      Queryquery= entityManager.createQuery(jpql);
 
      //占位符的索引是从 1 开始
      query.setParameter(1, 1);
      List<Customer>customers= query.getResultList();
      System.out.println(customers.size());
   }

 

3.1.2  查询部分

//默认情况下, 若只查询部分属性, 则将返回 Object[] 类型的结果. 或者 Object[] 类型的 List.
   //也可以在实体类中创建对应的构造器, 然后再 JPQL 语句中利用对应的构造器返回实体类的对象.
   @Test
   public void testPartlyProperties(){
      Stringjpql= "SELECT new Customer(c.lastName, c.age)FROM Customer c WHERE c.id > ?";
      Listresult= entityManager.createQuery(jpql).setParameter(1,1).getResultList();
 
      System.out.println(result);
   }

 

实体类添加构造方法

 

 

 

3.2  createNamedQuery

3.2.1  实体类

 

3.2.2  使用方法

//createNamedQuery 适用于在实体类前使用 @NamedQuery 标记的查询语句
   @Test
   public void testNamedQuery(){
      Queryquery= entityManager.createNamedQuery("testNamedQuery").setParameter(1,3);
      Customercustomer= (Customer) query.getSingleResult();
 
      System.out.println(customer);
   } 

 

3.3  createNativeQuery


//createNativeQuery 适用于本地 SQL
   @Test
   public void testNativeQuery(){
      Stringsql= "SELECT age FROM jpa_cutomers WHERE id= ?";
      Queryquery= entityManager.createNativeQuery(sql).setParameter(1, 3);
 
      Objectresult= query.getSingleResult();
      System.out.println(result);
   }


 

 参看代码:https://download.csdn.net/download/qq_26553781/10328392

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值