Java持久层的三种查询方式
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszsJava JPA有三种查询方式:
1)JPQL
2)Criteria API
3)SQL
下面一一详解。
一、本地SQL查询
SQL是标准化的查询语言,用于管理数据。下面的例子说明了怎样实现本地SQL查询:
// 获得实体管理器
EntityManager em = ...
// 建立SQL查询
String getByFirstName = "SELECT * FROM contacts c WHERE c.first_name = ?1";
// 创建查询实例
Query query = em.createNativeQuery(getByFirstName, Contact.class);
// 设置查询参数
query.setParameter(1, "John");
// 获取结果
List contacts = query.getResultList();
上面的例子告诉我们3件事:
1)用JPA建立查询,无需学习新的查询语言;
2)创建的查询没有类型安全,在使用前必须计算查询结果;
3)在运行程序前必须验证查询的拼写或语法是否有错误。
而且SQL查询会指定数据库的模式,因此除非必要,我们都应该避免使用此方式。
二、JPQL查询
JPQL是基于字符串的查询语言,语法类似于SQL。因此学习JPQL相当容易,只要有一定的SQL基础。看下面的代码:
// 获得实体管理器
EntityManager em = ...
// 建立JPQL查询
String getByFirstName = "SELECT c FROM Contact c WHERE c.firstName = :firstName";
// 创建查询实例
TypedQuery<Contact> query = em.createQuery(getByFirstName, Contact.class);
// 设置查询参数
query.setParameter("firstName", "John");
// 获取结果
List<Contact> contacts = query.getResultList();
上面的例子告诉我们3件事:
1)创建的查询是类型安全的,我们不必计算查询的结果;
2)JPQL查询字符串是易读、易于理解的;
3)创建的查询字符串在编译期间不会被验证。
JPQL对于静态查询是一个好办法。换句话说们,如果很多查询参数总是相同的,那么JPQL是我们的首选。但是,JPQL实现动态查询就显得很繁琐了。
三、Criteria API
Criteria API用于解决对接第三方ORM框架时让JPQL标准化。它用于构建查询定义对象,此对象会被翻译成可执行的SQL查询。下面的代码说明了这个问题:
// 获得实体管理器
EntityManager em = ...
// 获得Criteria建立器
CriteriaBuilder cb = em.getCriteriaBuilder();
// 建立Criteria查询
CriteriaQuery<Contact> query = cb.greateQuery(Contact.class);
// 创建查询Root
Root<Contact> root = query.from(Contact.class);
// 创建firstName的查询条件,使用静态元模型
Predicate firstNameIs = cb.equal(root.get(Contact_.firstName, "John"));
// 指定查询的where条件
query.where(firstNameIs);
// 创建查询并获取结果
TypedQuery<Contact> q = em.createQuery(query);
List<Contact> contacts = q.getResultList();
上面的例子告诉我们3件事:
1)创建的查询是类型安全的,不必计算查询的结果;
2)代码不如SQL或JPQL那么易读;
3)由于是使用Java API处理,Java编译器会确保查询的语法正确。
Criteria API对于创建动态查询是一个极好的工具。它使得创建动态查询更简便,因为我们处理的是对象,而不是处理查询的字符串。缺点在于随着查询的复杂度的增加,,查询定义对象的创建也会变得很繁琐,代码会更难读。
分享到:
相关推荐
java持久层框架对比
然而,在众多的Java持久层框架中,选择最佳方案并不是一件容易的事情。每个框架都有各自的特点和优势,例如Hibernate提供了强大的面向对象的数据库操作能力,MyBatis则更加注重SQL语句的灵活性和可读性。 无论...
java三层结构开发,很好的利用了MVC结构,尤其是对持久层的理解运用很有帮助与参考价值java三层结构开发,很好的利用了MVC结构,尤其是对持久层的理解运用很有帮助与参考价值java三层结构开发,很好的利用了MVC结构...
用类似Rails的方式来进行数据库操作。 Java来反射技术的运用。 建议用Netbeans打开源码
java三层结构开发,很好的利用了MVC结构,尤其是对持久层的理解运用很有帮助与参考价值java三层结构开发,很好的利用了MVC结构,尤其是对持久层的理解运用很有帮助与参考价值java三层结构开发,很好的利用了MVC结构...
java三层结构开发,很好的利用了MVC结构,尤其是对持久层的理解运用很有帮助与参考价值
个人整理的一套Java WEB 持久层技术知识点的清单,学些一门语言有个知识导图对入门的人可能减少迷茫学习起来方便一点~ 另外有本人整理的Java Web开发其它知识点清单~
精通hibernate3.0--java数据库持久层开发实践(付京周) 分两卷下载,需要积分共1分。谢谢 精通hibernate3.0--java数据库持久层开发实践(付京周) 分两卷下载,需要积分共1分。谢谢
个人整理的一套Java WEB 持久层 知识点的清单,学些一门语言有个知识导图对入门的人可能减少迷茫学习起来方便一点~ 另外有本人整理的Java Web开发其它知识点清单~
项目名称:轻量级Java持久层框架MiniDAO 项目简介: MiniDAO是一个基于SpringJDBC和FreeMarker技术的轻量级Java持久层框架。它以简洁的设计理念实现了SQL的分离和逻辑标签功能,与Mybatis的操作体验相媲美,同时...
java持久层API.pdf
java 实现自定义持久层框架代码,解析配置文件,手动封装返回结果,使用到了构建者模式、工厂模式、代理模式
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例。 在线Javadoc...
一个非常简单易懂的 JPA 例子,帮你快速入门JPA
ROR-ActiveRecord持久层框架的Java实现
自己手写的Java持久层框架DdwDao
精通hibernate3.0 java数据库持久层开发实践 付惊周编著 人民邮电出版社出版