您的位置:首页 > 其它

常见对话框之一AlertDialog

2015-10-30 11:52 260 查看
摘要

本章探讨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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: