简介
JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。
JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行
接口
javax.persistence.Query
Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的 createQuery、createNamedQuery 及 createNativeQuery 方法可以获得查询对象,进而可调用 Query 接口的相关方法来执行查询操作。
方法
- setHint(String hintName, Object value)
设置与查询对象相关的特定供应商参数或提示信息。参数名及其取值需要参考特定 JPA 实现库提供商的文档。如果第二个参数无效将抛出IllegalArgumentException异常。
- setParameter(int position, Object value)
为查询语句的指定位置参数赋值。Position 指定参数序号,从1开始,value 为赋给参数的值。
- setParameter(int position, Date value, 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 value, TemporalType type)
为查询语句的指定位置参数赋 Calendar值。position 指定参数序号,value 为赋给参数的值,temporalType 的含义及取舍同前。
- setParameter(String name, Object value)
为查询语句的指定名称参数赋值。
- setParameter(String name, Date value, TemporalType type)
为查询语句的指定名称参数赋 Date 值。用法同前。
- setParameter(String name, Calendar value, TemporalType type)
为查询语句的指定名称参数设置Calendar值。name为参数名,其它同前。该方法调用时如果参数位置或参数名不正确,或者所赋的参数值类型不匹配,将抛出 IllegalArgumentException 异常。
- 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 为直到提交事务时才更新数据库记录。
查询
1 createQuery
@Testpublic void testHelloJPQL() {String jpql = "from Customer c where c.age > ?1";Query query = entityManager.createQuery(jpql);query.setParameter(1, 12);List<Customer> customers = query.getResultList();System.out.println(customers.size());}
2 createNamedQuery
需要在实体类上面加上注解NamedQuery(name = “testNamedQuery”, query = “select c from Customer c where c.id = ?”)
// createNamedQuery 适用于实体类前使用@NameQuery标记的查询语句@Testpublic void testNameQuery() {Query query = entityManager.createNamedQuery("testNameQuery").setParameter(1, 3);Customer customer = (Customer) query.getSingleResult();System.out.println(customer);}
3 createNativeQuery
// createNativeQuery 适用于本地sql@Testpublic void testNativeQuery() {String sql = "select age From jpa_cutomers where id > ?";Query query = entityManager.createNativeQuery(sql).setParameter(1, 15);Object result = query.getSingleResult();System.out.println(result);}
4 查询缓存
// 使用hibernate的查询缓存 前提:配置中要启用查询缓存@Testpublic void testQueryCache() {String jpql = "from Customer c where c.age > ?";Query query = entityManager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true);query.setParameter(1, 12);List<Customer> customers = query.getResultList();System.out.println(customers.size());query = entityManager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true);query.setParameter(1, 12);customers = query.getResultList();System.out.println(customers.size());}
5 OrderBy
public void testOrderBy() {String jpql = "from Customer c where c.age > ? order by c.age desc";Query query = entityManager.createQuery(jpql);query.setParameter(1, 12);List<Customer> customers = query.getResultList();System.out.println(customers.size());}
6 GroupBy
// 查询order 数量大于2的那些customer@Testpublic void testGroupBy() {String jpql = "select o.customer from Order o group by o.customer having count(o.id) > 2";List<Customer> customers = entityManager.createQuery(jpql).getResultList();System.out.println(customers);}
7 关联查询
public void testLeftOuterJoinFetch() {// left outer join fetch 返回的是对象String jpql = "from Customer c left outer join fetch c.orders where c.id = ?";Customer customer = (Customer) entityManager.createQuery(jpql).setParameter(1, 14).getSingleResult();System.out.println(customer);System.out.println(customer.getOrders().size());// left outer join 返回的是Object[]String jpql = "from Customer c left outer join c.orders where c.id = ?";List<Object[]> result = entityManager.createQuery(jpql).setParameter(1, 14).getResultList();System.out.println(result);}
8 子查询
// 子查询 查询所有Customer的lastName为yy的order@Testpublic void testSubQuery(){String jpql = "select o from Order o where o.customer = (select c from Customer c where c.lastName = ?)";List<Order> orders = entityManager.createQuery(jpql).setParameter(1, "YY").getResultList();System.out.println(orders.size());}
9 函数
•字符串处理函数主要有:
–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,它们不需要参数,返回服务器上的当前日期、时间和时戳。
10 update操作
// delete与update同@Testpublic void testExecuteUpdate(){String jpql = "update Customer c set c.lastName = ? where c.id = ?";Query query = entityManager.createQuery(jpql);query.setParameter(1,"YYY");query.setParameter(2,13);query.executeUpdate();}
