jpa

概念 
创建使用Java Persistence API的存储库是一个繁琐的过程,需要大量时间并需要大量样板代码。一种推荐的方式是使用

元模型

概念 
在JPA中,标准查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的.这些实体可以是实体类,嵌入类或者映射的父类.提供受管实体元信息的类就是元模型类. 
简单的说就是元模型是实体类对应的一个“受管实体 
举个例子: 
实体类 Employee(com.demo.entities包中定义)

@Entity
@Table
public class Employee{  private int id;   private String name;private int age;@OneToManyprivate List<Address> addresses;// Other code…
}

Employee类的标准元模型类的名字是 Employee_

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(Employee.class)
public class Employee_ {     public static volatile SingularAttribute<Employee, Integer> id;   public static volatile SingularAttribute<Employee, Integer> age;   public static volatile SingularAttribute<Employee, String> name;    public static volatile ListAttribute<Employee, Address> addresses;
}

Employee的每一个属性都会使用在JPA2规范中描述的以下规则在相应的元模型类中映射:

  • 元模型类的属性全部是static和public的。
  • 元模型类的属性全部是static和public的。Employee的每一个属性都会使用在JPA2规范中描述的以下规则在相应的元模型类中映射:

  • 对于Addess这样的集合类型,会定义静态属性ListAttribute< A, B> b,这里List对象b是定义在类A中类型B的对象。其它集合类型可以是SetAttribute, MapAttribute 或 CollectionAttribute 类型。

看到这应该会有个疑问,这麻烦,为什么要使用这个元模型?有啥好处? 
好处肯定是有的,毕竟是标准jpa定义的东西。我这网上查了下,好处很多:

  • 查询更加类型安全

好吧,我暂时就查到这个。

criteria 查询

为了更好的理解criteria 查询,考虑拥有Employee实例集合的Dept实体,Employee和Dept的元模型类的代码如下:

//All Necessary Imports
@StaticMetamodel(Dept.class)
public class Dept_ {    public static volatile SingularAttribute<Dept, Integer> id;   public static volatile ListAttribute<Dept, Employee> employeeCollection;    public static volatile SingularAttribute<Dept, String> name;
}
//All Necessary Imports
@StaticMetamodel(Employee.class)
public class Employee_ {     public static volatile SingularAttribute<Employee, Integer> id;    public static volatile SingularAttribute<Employee, Integer> age;    public static volatile SingularAttribute<Employee, String> name;    public static volatile SingularAttribute<Employee, Dept> deptId;
}

下面的代码片段展示了一个criteria 查询,它用于获取所有年龄大于24岁的员工:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
Root<Employee> employee = criteriaQuery.from(Employee.class);
Predicate condition = criteriaBuilder.gt(employee.get(Employee_.age), 24);
criteriaQuery.where(condition);
TypedQuery<Employee> typedQuery = em.createQuery(criteriaQuery);
List<Employee> result = typedQuery.getResultList();

对应的SQL: SELECT * FROM employee WHERE age > 24

CriteriaBuilder 安全查询创建工厂

CriteriaBuilder 安全查询创建工厂,,创建CriteriaQuery,创建查询具体具体条件Predicate 等。 
CriteriaBuilder是一个工厂对象,安全查询的开始.用于构建JPA安全查询.可以从EntityManager 或 EntityManagerFactory类中获得CriteriaBuilder。 
比如:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery 安全查询主语句

  1. 它通过调用 CriteriaBuilder, createQuery 或CriteriaBuilder.createTupleQuery 获得。
  2. CriteriaBuilder就像CriteriaQuery 的工厂一样。
  3. CriteriaQuery对象必须在实体类型或嵌入式类型上的Criteria 查询上起作用。
  4. Employee实体的 CriteriaQuery 对象以下面的方式创建:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);

过Employee_元模型类age属性,称之为路径表达式。若age属性与String文本比较,编译器会抛出错误,这在JPQL中是不可能的。这就是元模型的作用吗??

Predicate[] 多个过滤条件

引用原文:http://blog.csdn.net/id_kong/article/details/70225032
List<Predicate> predicatesList = new ArrayList<Predicate>();predicatesList.add(.....Pridicate....)criteriaQuery.where(predicatesList.toArray(new Predicate[predicatesList.size()]));

转载于:https://www.cnblogs.com/mzdljgz/p/11387168.html

java-jpa-criteriaBuilder使用入门相关推荐

  1. java jpa 规范_Java:在JPA中使用规范模式

    java jpa 规范 本文是在Java中使用规范模式的简介. 我们还将看到如何将经典规范与JPA Criteria查询结合使用,以从关系数据库中检索对象. 在本文中,我们将使用以下Poll类作为创建 ...

  2. Java学习路线,java学习教程(入门到精通)

    你好,欢迎来到编程领域:阅读"Java入门",打包好了Java学习包,以及良好的阅读体验. 关于 Java 语言 由于 JVM 的支持,使得 Java 成为一种跨平台的编程语言,一 ...

  3. Java学习路线从入门到入土

    Java学习路线从入门到入土 Java学习路线从入门到入土 Java学习路线从入门到入土 简介 Java基础课程 第一阶段 第一部分:Java开发介绍 第二部分:Java数组 第三部分:Java面向对 ...

  4. java和php哪个运行更快,java和php哪个入门快?-php教程

    跟着互联网的高速倒退,愈来愈多的人开端抉择处置较量争论机行业,而想要处置相干工作的话,理解相干编程言语也是必备的一项技艺.可是有不少冤家正在抉择要学习的编程言语时就被难到了,想晓得哪一种言语入门更快, ...

  5. 《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口

    本节书摘来异步社区<Java 2D游戏编程入门>一书中的第1章,第1.5节,作者:[美]Timothy Wright(莱特),更多章节内容可以访问云栖社区"异步社区"公 ...

  6. java jpa hibernate_java - JPA和Hibernate - Criteria与JPQL或HQL

    java - JPA和Hibernate - Criteria与JPQL或HQL 使用Criteria或HQL有哪些优缺点? Criteria API是一种很好的面向对象的方式来表达Hibernate ...

  7. java消息头,Java网络编程从入门到精通:HTTP消息头字段

    Java网络编程从入门到精通:HTTP消息头字段 一.通用头字段 1. Connection 这个字段只在HTTP1.1协议中存在.它决定了客户端和服务器进行了一次会话后, 服务器是否立即关闭网络连接 ...

  8. JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser

    转载自 JSOUP 教程-- Java爬虫,简易入门,秒杀htmlparser 关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫  是爬sina 的数据,用的就是 htmlparser  可 ...

  9. java jpa 异步编程_异步处理时的JPA

    java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...

  10. WebService 理论详解、JWS(Java Web Service) 快速入门

    目录 WebService (web服务)概述 WebService 平台技术 WebService 工作原理 WebService 开发流程 常见 Web Service 框架 JWS(Java W ...

最新文章

  1. linux6 yum安装mysql_linux CentOS6.5 yum安装mysql 5.6
  2. dart系列之:集合使用实践
  3. 职场英语口语100句 (转载)
  4. MySql基本的操作
  5. EVEREST Ultimate Edition 4.50 Build 1330 Final
  6. GDAL C#中文路径,中文属性名称乱码问题
  7. 计算机硬盘除了c盘其他全不见了,电脑除了c盘其他盘都不见了
  8. 联想硬盘保护系统计算机名,联想硬盘保护系统,教您联想硬盘保护系统怎么用...
  9. Windows常用cmd命令总结
  10. office2010 错误1706 解决办法
  11. OBLOG4.0+DVBBS7.10 SP1整合
  12. Python实战:利用正则表达式(requests模块)获取电影排行榜
  13. 教给大家:怎样给电脑分盘。
  14. 关于ArcGIS的入门建议
  15. 云标签,关键字图排版 html5 canvas版
  16. 开始学ASP.NET了~·~得发奋啊……
  17. 如何治理谐波问题?——有源滤波器
  18. 天大青医堂第十期报告会之一
  19. 【leetcode】377. 组合总和 Ⅳ(combination-sum-iv)(DP)[中等]
  20. Excel函数 - 多条件统计

热门文章

  1. LeetCode19删除链表的倒数第N个节点20有效的括号
  2. Spring Cloud(七) GateWay 服务化和过滤器
  3. java 文件随机读取_Java 实现文件随机读写-RandomAccessFile
  4. a站手机访问电脑版_公司电脑一键变网盘,支持手机、家里电脑远程访问
  5. linux 安装 加入内核参数,Linux 实现自动安装服务组件以及优化内核参数
  6. java堆中的组成部分,初识Java虚拟机的基本结构 | If Coding
  7. 100+人的企业IP怎么进行安全配置 ?
  8. 内存管理vma_(十三)Linux内存管理之vma/malloc/mmap
  9. 开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
  10. Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)