Java持久层的三种查询方式

简介: Java JPA有三种查询方式:1)JPQL2)Criteria API3)SQL下面一一详解。 一、本地SQL查询 SQL是标准化的查询语言,用于管理数据。下面的例子说明了怎样实现本地SQL查询: [java] view plaincopyprint...
Java JPA有三种查询方式:
1)JPQL
2)Criteria API
3)SQL

下面一一详解。

一、本地SQL查询

SQL是标准化的查询语言,用于管理数据。下面的例子说明了怎样实现本地SQL查询:

[java]   view plain copy print ?
  1. // 获得实体管理器  
  2. EntityManager em = ...  
  3. // 建立SQL查询  
  4. String getByFirstName = "SELECT * FROM contacts c WHERE c.first_name = ?1";  
  5. // 创建查询实例  
  6. Query query = em.createNativeQuery(getByFirstName, Contact.class);  
  7. // 设置查询参数  
  8. query.setParameter(1"John");  
  9. // 获取结果  
  10. List contacts = query.getResultList();  

上面的例子告诉我们3件事:
1)用JPA建立查询,无需学习新的查询语言;
2)创建的查询没有类型安全,在使用前必须计算查询结果;
3)在运行程序前必须验证查询的拼写或语法是否有错误。

而且SQL查询会指定数据库的模式,因此除非必要,我们都应该避免使用此方式。

二、JPQL查询

JPQL是基于字符串的查询语言,语法类似于SQL。因此学习JPQL相当容易,只要有一定的SQL基础。看下面的代码:

[java]   view plain copy print ?
  1. // 获得实体管理器  
  2. EntityManager em = ...  
  3. // 建立JPQL查询  
  4. String getByFirstName = "SELECT c FROM Contact c WHERE c.firstName = :firstName";  
  5. // 创建查询实例  
  6. TypedQuery query = em.createQuery(getByFirstName, Contact.class);  
  7. // 设置查询参数  
  8. query.setParameter("firstName""John");  
  9. // 获取结果  
  10. List contacts = query.getResultList();  

上面的例子告诉我们3件事:
1)创建的查询是类型安全的,我们不必计算查询的结果;
2)JPQL查询字符串是易读、易于理解的;
3)创建的查询字符串在编译期间不会被验证。

JPQL对于静态查询是一个好办法。换句话说们,如果很多查询参数总是相同的,那么JPQL是我们的首选。但是,JPQL实现动态查询就显得很繁琐了。

三、Criteria API

Criteria API用于解决对接第三方ORM框架时让JPQL标准化。它用于构建查询定义对象,此对象会被翻译成可执行的SQL查询。下面的代码说明了这个问题:

[java]   view plain copy print ?
  1. // 获得实体管理器  
  2. EntityManager em = ...  
  3. // 获得Criteria建立器  
  4. CriteriaBuilder cb = em.getCriteriaBuilder();  
  5. // 建立Criteria查询  
  6. CriteriaQuery query = cb.greateQuery(Contact.class);  
  7. // 创建查询Root  
  8. Root root = query.from(Contact.class);  
  9. // 创建firstName的查询条件,使用静态元模型  
  10. Predicate firstNameIs = cb.equal(root.get(Contact_.firstName, "John"));  
  11. // 指定查询的where条件  
  12. query.where(firstNameIs);  
  13. // 创建查询并获取结果  
  14. TypedQuery q = em.createQuery(query);  
  15. List contacts = q.getResultList();  

上面的例子告诉我们3件事:
1)创建的查询是类型安全的,不必计算查询的结果;
2)代码不如SQL或JPQL那么易读;
3)由于是使用Java API处理,Java编译器会确保查询的语法正确。

Criteria API对于创建动态查询是一个极好的工具。它使得创建动态查询更简便,因为我们处理的是对象,而不是处理查询的字符串。缺点在于随着查询的复杂度的增加,,查询定义对象的创建也会变得很繁琐,代码会更难读。

目录
相关文章
|
6月前
|
存储 Java 关系型数据库
养老保障金查询系统【GUI/Swing+MySQL】(Java课设)
养老保障金查询系统【GUI/Swing+MySQL】(Java课设)
39 0
|
6月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(Dept.java)
Hibernate中使用Criteria查询及注解——(Dept.java)
|
19天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
5月前
|
SQL Java API
Java一分钟之-JPA查询:JPQL与Criteria API
【6月更文挑战第14天】本文探讨了Java Persistence API (JPA)中的两种查询方式:JPQL和Criteria API。JPQL是面向对象的SQL,适用于简单查询,而Criteria API则提供类型安全的动态查询构造。文章指出了每种方法的常见问题和避免策略,如混淆实体属性与数据库字段、参数绑定错误、过度复杂化和性能问题。建议开发者根据需求选择适当的方法,并关注查询的可读性、可维护性和性能优化。
66 2
|
25天前
|
缓存 Java 数据处理
java查询大量数据优化
通过结合的高性能云服务,如其提供的弹性计算资源与全球加速网络,可以进一步增强这些优化策略的效果,确保数据处理环节更加迅速、可靠。蓝易云不仅提供稳定的基础架构,还拥有强大的安全防护和灵活的服务选项,是优化大型数据处理项目不可或缺的合作伙伴。
27 0
|
6月前
|
Java
PTA 航空公司VIP客户查询(Java)
PTA 航空公司VIP客户查询(Java)
43 2
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
33 1
|
3月前
|
存储 Java API
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
5月前
|
安全 Java API
Java一分钟之-GraphQL:查询语言与API设计
【6月更文挑战第11天】GraphQL,一种革命性的查询语言,正在改变Web开发中的API构建和使用方式。它允许客户端按需请求数据,减少冗余,提升性能。本文概述了GraphQL的核心理念,如声明式查询、强类型和统一入口,并讨论了Java开发者常遇问题:过度查询、Schema设计和安全性。解决方案包括使用Dataloader、优化Schema和实现授权机制。通过理解原理、关注性能、重视安全和持续实践,开发者能更好地利用GraphQL构建高效API。
488 2