JPA学习笔记-JPQL

JPQL语言,即 JavaPersistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query接口封装执行

javax.persistence.Query

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

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


查询部分属性

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

对应的构造函数如下

	public Customer(String lastName, int age) {
		super();
		this.lastName = lastName;
		this.age = age;
	}


@NamedQuery注解

		@Test
		public void testNamedQuery() {
			Query query = entityManager.createNamedQuery("testNamedQuery").setParameter(1, 1);
			User user = (User) query.getSingleResult();
			System.out.println(user);
		}

在实体类前使用@NamedQuery注解

@NamedQuery(name="testNamedQuery", query="select u from User u where u.id = ?")
@Cacheable(true)
@Table(name = "jps_user")
@Entity
public class User {
	@GeneratedValue
	@Id
	private Integer id;
	private String username;
	private String password;
	//getter setter
}


本地SQL

		//本地SQL
		@Test
		public void testNativeQuery() {
			String sql = "select username from jps_user where id = ?";
			Query query = entityManager.createNativeQuery(sql).setParameter(1, 1);
			Object result = query.getSingleResult();
			System.out.println(result);
		}


JPQL查询缓存

@Test
public void testQueryCache() {
	String jpql = "from User u where u.id > ?";
	Query query = entityManager.createQuery(jpql).setParameter(1, 1);
	List<User> users = query.getResultList();
	System.out.println(users);

	System.out.println("----------------");//默认情况下发送两条S	QL查询语句

	query = entityManager.createQuery(jpql).setParameter(1, 1);
	users = query.getResultList();
	System.out.println(users);
}

启用查询缓存

配置文件中配置

<property name="hibernate.cache.use_query_cache" value="true"/>

@Test
public void testQueryCache() {
	String jpql = "from User u where u.id > ?";
	Query query = entityManager.createQuery(jpql).setParameter(1, 1).setHint(QueryHints.HINT_CACHEABLE, true);
	List<User> users = query.getResultList();
	System.out.println(users);

	System.out.println("----------------");//默认情况下发送两条SQL查询语句,开启查询缓存则只发送一次SQL语句

	query = entityManager.createQuery(jpql).setParameter(1, 1).setHint(QueryHints.HINT_CACHEABLE, true);
	users = query.getResultList();
	System.out.println(users);
}


order by语句

@Test
public void testOrderBy() {
	String jpql = "from User u where u.id > ? order by id desc";
	Query query = entityManager.createQuery(jpql).setParameter(1, 1).setHint(QueryHints.HINT_CACHEABLE, true);
	List<User> users = query.getResultList();
	System.out.println(users);
}


group by

@Test
public void testGroupBy() {
	String jpql = "select o.customer from Order o group by o.customer having count(o.id) > 1";
	List<Customer> customers = entityManager.createQuery(jpql).getResultList();
	System.out.println(customers);
}


left outer join fetch

@Test
public void testLeftOuterJoinFetch() {
	//一条查询语句即可。如果不写left outer join fetch则需要发送两条SQL语句。
	String jpql = "from Customer c left outer join fetch c.orders where c.id = ?";
	Customer customer = (Customer) entityManager.createQuery(jpql).setParameter(1, 3).getSingleResult();
	System.out.println(customer.getOrders().size());
}


子查询

@Test
public void testSubQuery() {
	//查询LashName是SS的用户的所有的order
	String jpql = "select o from Order o where o.customer = (select c from Customer c where c.lastName = ?)";
	Query query = entityManager.createQuery(jpql).setParameter(1, "SS");
	List<Order> orders = query.getResultList();
	System.out.println(orders);
}


JPQL函数

@Test
public void testJPQLFucntion() {
	String jpql = "select upper(c.email) from Customer c";
	List<Customer> customers = entityManager.createQuery(jpql).getResultList();
	System.out.println(customers);
}

JPQL提供了以下一些内建函数,包括字符串处理函数、算术函数和日期函数。

字符串处理函数主要有:

–concat(String s1, String s2):字符串合并/连接函数。

–substring(String s, int start, int length):取字串函数。

–trim([leading|trailing|both,] [char c,] String s):从字符串中去掉首/尾指定的字符或空格。

–lower(String s):将字符串转换成小写形式。

–upper(String s):将字符串转换成大写形式。

–length(String s):求字符串的长度。

–locate(String s1, String s2[, int start]):从第一个字符串中查找第二个字符串(子串)出现的位置。若未找到则返回0。

算术函数主要有 abs、mod、sqrt、size 等。Size 用于求集合的元素个数。

日期函数主要为三个,即 current_date、current_time、current_timestamp,它们不需要参数,返回服务器上的当前日期、时间和时戳。



update&delete操作

@Test
public void testUpdate() {
	String jpql = "update Customer c set c.lastName = ? where c.id = ?";
	Query query = entityManager.createQuery(jpql).setParameter(1, "[email protected]").setParameter(2, 7);
	query.executeUpdate();
}
时间: 2024-08-28 14:00:05

JPA学习笔记-JPQL的相关文章

JPA学习笔记(5)——EntityManager相关

Persistence EntityManagerFactory EntityManager find方法 getReference方法 persist方法 remove方法 merge方法 情况1传入的对象没有id 情况2传入的对象有identityManager的缓存中没有该对象数据库中没有该记录 情况3传入的对象有identityManager的缓存没有该对象数据库中有该记录 情况4传入的对象有identityManager的缓存有该对象 flush方法 refresh方法 clear c

JPA学习笔记(8)——映射一对多关联关系

一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; imp

spring data jpa学习笔记一:helloworld

在学习 JPA Spring Data之前,我们有必要了解一下JPA和Spring Data. JPA JPA全称Java Persistence API.即java持久化规范.JPA通过注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. Spring Data Spring Data是Spring框架的一个子项目,就像Spring MVC是Spring的一部分一样.使得数据库访问变得方便和快捷.Spring Data 支持JPA. JPA Spring Data J

Spring入门---JPA学习笔记

用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概念: 对象关系映射ORM(Object/Relation Mapping)是一种为了解决面向对象和关系数据之间存在互不匹配现象的技术(范式不匹配).简而言之,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到数据库中.本质上是将数据从一种形式转换到另外一种形式.(个人考虑:

JPA学习笔记(12)——JPQL

Query接口 int executeUpdate() 用于执行update或delete语句. List getResultList() 用于执行select语句并返回结果集实体列表. Object getSingleResult() 3用于执行只返回单个结果实体的select语句. Query setFirstResult(int startPosition) 用于设置从哪个实体记录开始返回查询结果. Query setMaxResults(int maxResult) 用于设置返回结果实体

JPA学习(6)JPQL

JPQL语言,即 Java Persistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异. JPQL语言的语句可以是 select 语句.update 语句或delete语句,它们都通过 Query 接口封装执行. 1.Query接口封装了执行数据库查询的相关方法.调用 EntityManager 的 createQuery.create NamedQuer

JPA学习笔记

一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 实体: entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字 游离状态实体以值方式进行传递,需要serializable JPA是一套规范.有很多框架支持(如Hibernate3.2以上.Toplink,一般用

JPA学习笔记-Hello world

Java Persistence API:用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层 JPA 是hibernate的一个抽象(就像JDBC和JDBC驱动的关系): –JPA 是规范:JPA 本质上就是一种  ORM 规范,不是ORM 框架 -- 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由ORM 厂商提供实现 –Hibernate 是实现:Hibernate 除了作为

JPA学习笔记1——JPA基础 (转自CSDN)

http://blog.csdn.net/chjttony/article/details/6086298 1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblo