`
liwy2008
  • 浏览: 27531 次
  • 性别: Icon_minigender_2
  • 来自: 海口
社区版块
存档分类
最新评论

jpa查询语言1

    博客分类:
  • jpa
阅读更多
摘要

本章探讨Java持久化查询语言(JPQL),在简单的向你介绍JPQL后,会直接切入创建查询这个话题。本章会涉及一个查询的方方面面,包括fetch join操作。fetch join操作会提前读取延时关联(lazy relationship),以消除LazyInitializationException异常,这在使用ORM方案时,常常困扰很多应用程序的开发。接下来,会了解一下JPQL的打量操作支持。学习完本章时,你会对JPQL有一个全面的认识。






概述
JPQL是一种与数据库无关的,基于实体(entity-based)的查询语言。它是EJB QL的一个扩展,并加入了很多EJB QL中所没有的新特性。JPQL支持projection(可以查询某个实体的字段而不需要查询整个实体),批量操作(update和delete),子查询,join,group by和having操作。所有的JPQL操作都在静态查询(命名查询,named query)和动态查询中得到支持。另外,JPQL支持多态,当读取Rank会返回SpecialRank和PostCountRank实例(instance)(Rank是一个抽象类,JPQL只返回具体类)。

JPQL在语法上与SQL相似:“ select from [where] [group by] [having] [order by] ”。如果你熟悉SQL,那么对大部分的JPQL语法也不会陌生。JPQL同样支持SQL类似的函数功能,如max和min,但是并不能取代SQL。不管如何相似,但两者之间有一个重要的区别,JPQL操作的是“抽象持久化模型(abstract persistence schema)”,而不是数据库定义的物理模型。抽象持久化模型通常是用JPA元数据(metadata)在ORM文件中或注释(annotation)中进行定义(有关注释和ORM的更多信息参见第2章Entities Part I,第3章Entities Part II,第4章Packaging)。抽象持久化模型包括实体,它们的字段及定义的所有关联关系。JPA持久化工具可以将JPQL转换成内置的SQL查询语句。这就意味着你可以在查询语句的SELECT指定一个实体或是它的字段,或者在WHERE语句中使用多个实体。你可以用点号(.)来访问查询语句中的SELECT部分的关联关系。下面这个例子是访问agoraBB对象模型中从PrivateMessage到User的关联。



SELECT p.toUser FROM PrivateMessage p 这个查询会得到PrivateMessage所属的User。

虽然可以说JPQL可以将所有的操作当成查询,但实际上只有三种不同的“查询”:SELECT查询(真正可以算得上的一个查询),更新查询(不是查询而是更新语句),或者删除查询(也不是真正的查询而是删除语句)。JPA规范中将所有的这些查询当成查询,你可以用同样的语法定义这三种查询,它们之间的差别会反应到数据库上。

本章包含以下话题:





JPQL概述

Join

Where,Group By,Having

SELECT语句

批量操作支持

实例

JPQL操作的就是抽象持久化模型,即一个持久化单元(persistence unit)中实体所表示的模型。使用SQL,你可以直接查询数据库中表的字段;使用JPQL,你可以查找实体的属性。一个JPQL语句的各个组成部分都是针对实体或者实体的属性进行操作。你根本不会用到一个实体所映射的数据库表和字段。下面是你可以创建紧最基本的JPQL语句:



SELECT u FROM User查询从数据库返回所有的User实例。



注意
除实体名称和实体字段外,JPQL查询不区分大小写。所以在查询的其它部分你可以使用任意形式。本章中,所有JPA保留标志符我们使用大写,在你的应用程序中并不要求要这么做。






类型
JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型。



注意
强类型语言中规定某种表达式对某种类型是合法的。如果在Java中编译"123"+3,你会得到一个类型不相容的编译器错误。

例如,有下面这样一个查询语句:



SELECT u.username FROM User u在这个查询语句中,u.username一个表达式的结果是一个String类型。这个查询会返回一个String对象的list。list中的各个对象代表系统中一个不同的用户名。JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型(abstract schema type)。

一个实体可以包含一个或多个下面的抽象模型类型:



状态字段(state-field):这种类型包括一个实体不代表关联关系的任何字段或属性。字段的类型或者一个属性get方法的返回结果决定了状态字段的抽象模型类型。

关联字段(association-field):这种类型包括了一个实体中任何表示关联关系的字段或属性。关联字段的抽象模型类型就是目标实体的抽象模型类型。

JPQL语句的作用范围是由你执行查询语句中持久化单元(persistence unit)的实体决定的。

在一个查询中,实体是通过实体名称来引用的。实体的名称就是你使用@Entity注释时指定的名称,或者是实体的限定词(unqualified name)。假如有这样一个实体。



package com.sourcebeat.jpa.model;@Entity(name="message")public class PrivateMessage extends ModelBase { // fields/methods removed for readability} 实体名称是“ message ”,因为你在使用@Entity时候指定了名称(在一个持久化单元内实体名称必须是唯一的)。在下面的代码中,实体的限定词是User(以一个大写的“U”开头)。实体的全名是com.sourcebeat.jpa.model.User,但它的限定词 是User。



package com.sourcebeat.jpa.model;@Entitypublic class User extends ModelBase { // fields/methods removed for readability} 当我们在JPQL中引用实体时,必须使用@Entity注释指定的名称或是实体的限定词 。一些JPA实现(如,Hibernate)允许你使用全名,但有的(如,Toplink)则抛出异常。为了保证移植性,在查询中最好使用限定词 。

一个标识变量(identification variable)是一个在FROM语句中指定的一个标志符号。在下面的查询语句中,u就是一个标识变量。u类型就是能够识别名称User的实体的抽象模型类型。在本例中,实体是User(前面已经定义),所以u的类型是User。



SELECT u FROM User u 标识变量也可以使用JOIN关键字定义,例如。



SELECT r.name FROM User u JOIN u.roles r 这里,标识变量有u和r。r表示任何能够从一个User实例中直接访问的Role。






保留标志符
JPA定义了以下保留标志符(虽然下面列表中显示是大写形式,保留标志符并不区分大小写,所以SELECT和select或SelECt等同。)



SELECT, FROM, WHERE, UPDATE, DELETE, JOIN, OUTER, I

分享到:
评论

相关推荐

    jpa查询语言.pdf

    jpa查询语言.pdf

    JPA查询语言[归类].pdf

    JPA查询语言[归类].pdf

    JPA学习中文文档

    JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

    Java JPA 学习资料 合集

    JPA 规范部分详细的介绍了 JPA 中实体 Bean 的定义,并介绍了实体 Bean 支持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。 JPA 标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,...

    JPA深度刘宝宝剖析版第一讲

    可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。 支持面向对象...

    Spring Data JPA笔记.zip

    JPA 的全称是 Java Persistence API, 即 Java 持久...JPA 的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以 看成是 Hibernate HQL 的等价物。 本文档包含了JPA的课件笔记与学习标注。

    JPA 资料大集合

    每个批注的详细与使用 查询语言 教程等等

    国外java源码社区-graphql-jpa-query:为您的JPA实体模型生成GraphQL查询Api

    查询语言,用于使用现有数据完成这些查询。 GraphQL 为您的 API 中的数据提供了完整且易于理解的描述,让客户能够准确地询问他们需要什么,更容易随着时间的推移发展 API,并启用强大的开发人员工具。 您的应用程序...

    JPA开发文档API

    JDBC支持处理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供 SQL 查询语言查找数据。JDBC 所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去...

    开发JPA应用.pdf

    EJB 查询语言开发。其实关于JPA 还有一部分是基于EJB 容器环境 的开发,那一部分内容我们将会放到后面的EJB 开发一章来介绍。由于MyEclipse 6 对JPA 开发提供了很方便的支持,因此我们的内容主要就集中在如何使用...

    jpa使用说明(English)

    查询语言查找数据。 JDBC 所使用的关系模型不是为保存对象而设计的, 因此迫使开发者选择在处理持久数据时 放弃面向对象编程, 或者自己去开发将面向对象特性(比如: 类之间的继承) 和关系型数据 库进行...

    开发JPA应用

    13.1.3.6 JPA 查询语言(JPA QL)简介...................... 19 13.1.3.7 回调方法 ....................................... 21 13.2 准备工作............................................ 22 13.3创建...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第11章 JPA的查询支持 456 11.1 查询API 457 11.1.1 面向对象的JPQL 457 11.1.2 查询API简介 457 11.2 执行查询 459 11.2.1 使用Query创建查询 459 11.2.2 设置查询参数 459 11.2.3 取得查询结果 460 11.3 JPQL语法 ...

    Spring Data JPA 106精讲

    Spring Data 是 Spring 的一个子...2:详解Spring Data JPA封装的各种查询方式 3:详解Spring Data JPA常用接口 4:详解Spring Data JPA各种查询方式 5:详解Spring Data JPA在web方面的用法 具体内容,可以参考大纲:

    FluentJPA:Fluent API,用于用Java为JPA编写类型安全SQL查询

    通过JPA重新控制SQL FluentJPA是一种用于关系(SQL)数据库和JPA的语言集成查询(LINQ)技术。 它允许您通过直接集成到语言中来使用Java编写强类型查询。FluentJPA如何集成到Java中? 乍一看,似乎我们需要Java...

    Spring boot + JPA进销存管理系统源码

    本系统基本完成了一个基于spring boot + JPA的进销存管理系统,主要实现采购管理、库存管理、销售管理、查询统计、资料管理和系统管理功能。 本系统的实现依靠了很多计算机技术,包括Java语言、Spring boot框架、JPA...

    基于springboot+mysql+SpringDataJPA +html实现学生选课管理系统

    编程语言:JDK1.8,HTML,CSS,JS,jQuery 数据库:mysql5.7以上 4.项目需求 题目描述 基于Spring Boot和Spring Data JPA设计一个简单的在线课程系统,需要实现以下功能: 1.课程的增删改查(CRUD),每门课程包括课程...

    Spring boot + JPA进销存管理系统源码详细部署说明

    现采购管理、库存管理、销售管理、查询统计、资料管理和系统管理功能。 本系统的实现依靠了很多计算机技术,包括Java语言、Spring boot框架、 JPA持久层框架和MySQL数据库。带视频,带文档 运行环境:idea/...

    Eclipsejee下JPA的开发

    一、预备知识JPA即JavaPersistenceAPI,它是是EJB3.0规范(JSR...1,简化程序模型2,使用注释,简化配置3,ORM:对象关系映射4,EJB-QL:提供了动态查询,和功能强大的EJB查询语言5,独立。可在EJB容器之外单独运行,也

    JPA-eclipselink-project:使用 EclipseLink 实现的 JPA 项目示例

    API 提供类似于 SQL 的查询语言,但使用对象而不是数据库中的关系实体。 Java Persistence API 基于实体,这些实体是简单的带注释的 POJO,以及这些实体的管理器 (EntityManager),它提供处理它们的功能(添加、...

Global site tag (gtag.js) - Google Analytics