jpa查询语言

jpa查询语言
jpa查询语言

JPA查询语言(JPQL)

JPQL,SQL和批量处理

白汉奇[译]

目录

概述 (1)

类型 (2)

保留标志符 (4)

路径表达式 (4)

界定变量(Range Variables) (6)

JOINS (6)

INNER JOIN (7)

LEFT OUTER JOIN (7)

FETCH JOIN (8)

WHERE,GROUP BY,HAVING (10)

条件表达式(CONDITIONAL EXPRESSIONS) (10)

函数与表达式(FUNCTIONS AND EXPRESSIONS) (10)

字符串函数(STRING FUNCTIONS) (13)

数学函数(ARITHMETIC FUNCTIONS) (13)

时间函数(DATETIME FUNCTIONS) (14)

SECLECT函数 (14)

构造器函数(CONSTRUCTOR EXPRESSION) (15)

统计函数(AGGREGATE FUNCTIONS) (15)

使用法则(RULES OF USAGE) (16)

排序(ORDER BY) (16)

批量处理(BULK OPERATIONS) (17)

实例 (18)

总结(SUMMARY) (20)

本章探讨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 https://www.360docs.net/doc/5d855257.html,ername FROM User u

在这个查询语句中,https://www.360docs.net/doc/5d855257.html,ername一个表达式的结果是一个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”开头)。实体的全名是https://www.360docs.net/doc/5d855257.html,er,但它的限定词是User。

package com.sourcebeat.jpa.model;

@Entity

public 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 https://www.360docs.net/doc/5d855257.html, FROM User u JOIN u.roles r

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

保留标志符

JPA定义了以下保留标志符(虽然下面列表中显示是大写形式,保留标志符并不区分大小写,所以

SELECT和select或SelECt等同。)

SELECT,FROM,WHERE,UPDATE,DELETE,JOIN,OUTER,INNER,LEFT,GROUP,

BY,HAVING,FETCH,DISTINCT,OBJECT,NULL,TRUE,FALSE,NOT,AND,OR,

BETWEEN,LIKE,IN,AS,UNKNOWN,EMPTY,MEMBER,OF,IS,AVG,MAX,MIN,

SUM,COUNT,ORDER,BY,ASC,DESC,MOD,UPPER,LOWER,TRIM,POSITION,

CHARACTER_LENGTH,CHAR_LENGTH,BIT_LENGTH,CURRENT_TIME,CURRENT_DATE,

CURRENT_TIMESTAMP,NEW,EXISTS,ALL,ANY,SOME.

UNKNOWN目前在JPQL中还没有用到。

路径表达式

路径表达式就是一个标识符号紧跟一个访问操作符(.)再紧跟一个状态字段或是关联字段。只要它

们不是集合(collections),就可以遍历关系。下图是agoraBB项目对象模型的一部分,用于解释路

径表达式。

图 1. 路径表达式模型实例

PrivateMessage所属于的User的关系是由PrivateMessage的关联关系字段toUser表示的。

User有一个关联到Role的集合关联字段roles,还有一个关联到UserIpAddress的字段

userIpAddress。

由于在在这些关系,你可以进行以下操作。

?PrivateMessage所属用户User的IP地址UserIpAddresses

SELECT https://www.360docs.net/doc/5d855257.html,erIPAddresses from PrivateMessage p

?PrivateMessage所属用户User的角色Role

SELECT p.toUser.roles from PrivateMessage p

?User的角色Role,获取所有的无重复的角色名称。

SELECT DISTINCT https://www.360docs.net/doc/5d855257.html, FROM User u JOIN u.roles r

?User的IP地址UserIpAddresses

SELECT DISTINCT https://www.360docs.net/doc/5d855257.html,erIPAddresses FROM User u

下图关系略有不同。

图 2. 路径表达式模型实例2

图中,论坛Forum与其主题Topics的关系由Forum的字段topics表示,从Topics到Post的关系由Topic的字段topics表示。从对象关系图可以看出哪些JPQL是合法的,哪些不合法。

?查询论坛Forum的主题Topic,要获取标题(subject):路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.subject FROM Forum f–ILLEGAL

?查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT t.subject FROM Forum f JOIN f.topics AS t

?查询论坛Forum主题Topic的帖子Post,,路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.posts FROM Forum f–ILLEGAL

?查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT p FROM Forum f JOIN f.topics t JOIN t.posts p

注意

虽然JPA规范中明确表示无法访问一个集合关系字段,据我在Hibernate和Toplink上的测试,在一个目标实体中可以访问集合关联字段或状态字段。在JPA的BNF范式针对路径访问指明了从Forum

访问Topic,所以读取主题就是非法的。如果你要访问一个集合字段的目标,使用第二个例子如

示JOIN语法。

总之,你可以使用导航操作符(.)来遍历实体对象关系图,查询的类型是由SELECT语句决定的。

SELECT语句可以包含标识变量和路径表达式。路径表达式可以遍历整个对象关系图,只要你从

左到右访问的是单值关联字段,你无法访问一个集合字段或是一个状态关联字段。

界定变量(Range Variables)

界定变量使用与&SQL相似的语法,将实体名绑定到一个标志符上。界定变量声明如下(在一个

查询语句的SELECT语句):

entityName[AS]identification_variable

你可以通过使用多个界定变量来使用同一实体,下面的例子来自JPA规范。

SELECT DISTINCT o1

FROM Order o1,Order o2

WHERE o1.quantity>o2.quantity AND

https://www.360docs.net/doc/5d855257.html,stname=‘Smith’AND

o2.customer.firstname=‘John’

此查询返回大于John Smith的定单的所有的订单。

JOINS

join出现在两个或多个实体联合查询产生一个JPQL查询结果。JPQL中join与SQL中的SQL相似。最

后,要说明的是,所有的JPQL会转换成SQL查询。出现以下情况时,就可以用上join。

?访问集合关联字段的路径表达式出现在SELECT语句

?join保留字出现在WHERE语句中

?定义两个或多个界定变量

如果你在一个查询中使用了一个以上的实体,你会获取所有实体的实例。这一结果称为Cartesian

product(卡笛尔产品)。假使你的系统中有8个角色和4个用户,下面的查询会得到32个对象。

SELECT r,u FROM Role r,User u

你可能想用某种join来减少查询结果的数量。如果你想通过字段而不是通过主键来关联实体,你可

以使用theta-join。例如:

SELECT t FROM Topic t,Forum f WHERE t.postCount= f.forumPostCount

这条查询语句返回的是与论坛回复(Forum)数相同的主题(Topic)。theta-join允许你关联那些

没有显式关联关系或者关联到没有关系但是等同的信息的实体。

INNER JOIN

JPQL中inner join也是用于关系联合。其语法如下:

[INNER]JOIN join_association_path_expression[AS]identification_variable

INNER和AS都是可选的。虽然它们对查询没有什么影响,你还是可以使用它们来更加清晰的表达

你的意图。

join_assocation_path_expression的意思是你可以访问一个关联实体,不管是单值关联

还是一个集合。下图演示了两个inner join查询:

图 3.

因为你不能在SELECT语句中使用一个集合关联字段,JPQL为你提供了INNER JOIN操作符。如

果你想访问Forum-Topic-Post的关联关系(如图2所示),获得所有Post的标题,你可以使用

这样一条查询语句:

SELECT p.title FROM Forum f JOIN f.topics AS t JOIN t.posts AS p

这条查询会返回0个或多个String对象,封装的是Forum-Topic-Post联合查询的回复的标题。

LEFT OUTER JOIN

一个outer join会返回一个实体的所有实例和其它与join criteria匹配的其它实体的实例。一个left join

的语法如下:

LEFT[OUTER]JOIN join_association_path_expression[AS]identification_variable [OUTER]是可选的,因为在JPQL中LEFT JOIN和LEFT OUTER JOIN以认为是等同的。使用上

图中所示的Forum/Post实体关系,下面的left join操作可以读取所有的Forum和任何与Forum关

联的Topic。如果找不到Topic,Object数组的第2项的值就是null。

SELECT f,t FROM Forum f LEFT JOIN f.topics t

使用范例数据库,上面的查询会返回以下结果:

[Object:[Forum]Object:[Topic]]

[Object:[Forum]Object:[null]]

[Object:[Forum]Object:[null]]

[Object:[Forum]Object:[null]]

[Object:[Forum]Object:[null]]

这个查询返回了所有的Forum实例和一个唯一的Topic,因为仅有一个Forum有一个Topic(看起

来留言板需要更多的用户参与)。

由于LEFT JOIN操作符是预读取的一种有效方式,JPA还提供了FETCH JOIN操作。FETCH JOIN

操作符在下一节介绍。

FETCH JOIN

fetch join允许你创建查询来预读取另外一种lazy关联关系。如果你了解到在所有的实体读取之后并

可能处于脱管状态时就有必要使用LAZY关联关系,你就可以使用FETCH JOIN来读取这种关系。

FETCH JOIN如下:

[LEFT[OUTER]INNER]JOIN FETCH join_association_path_expression

和前面定义不同的是,FETCH JOIN没有范围变量,因为你不能在查询语句中使用隐式引用的实

体。下面的查询会读取任何有主题(Topic)的论坛(Forum)实体,仅仅那有主题(Topic)的论坛

(Forum)实体才会被读取。下面代码演示了如何定义论坛(Forum)实体。注意与主题(Topic)的关

联关系是lazy。

@Entity

public class Forum extends ModelBase implements Serializable{

@OneToMany(fetch=https://www.360docs.net/doc/5d855257.html,ZY,

cascade={CascadeType.PERSIST,

CascadeType.MERGE},

mappedBy="forum")

@OrderBy("type asc,dateUpdated desc")

Settopics=new HashSet();

//...

}

这里有一条查询语句:

SELECT DISTINCT f FROM Forum f JOIN FETCH f.topics

因为数据库中有5个Forum实例,但仅有一个有Topic。上面的查询语句会返回一个Forum实例,Topic的关联关系也立即读取。如果你不使用DISTINCT,持久化实现方案(persistence provider)会为系统中每个返回一个Forum实例。使用了DISTINCT,重复的实例会被删除。

要读取所有的论坛(Forum)实例,并立即读取它们的主题(Topic),如下在的查询语句所示,SELECT DISTINCT f FROM Forum f LEFT JOIN FETCH f.topics

这条返回所有唯一的论坛(Forum)实例,并且所有的主题(topics)已经预先读取了。使用JOIN FETCH的一个缺点是需要知道对象模型。一旦你知道关联关系的类型,就可以用JOIN FETCH优化你的查询。

查询中的WHERE语句是由条件表达式组成,由它决定返回的实体。只要你将使用GROUP BY的字段放到SELECT语句中,你可以用GROUP BY来统计查询结果。你还可以用HAVING过滤查询结果。JPA并没有要求持久化实现在不使用GROUP BY支持HAVING,可以保持可移植性,你最好不要在GROUP BY外使用HAVING。

图 4. Post/User对象关系图

现在假设你想知道创建的agoraBB系统中每个用户的发帖数量。从上图中可以看,没有从User 到Post的关联关系。因为User和Post继承ModelBase MappedSuperclass的,我们知道每个Post对象有一个createdByUser和updatedByUser字段。

使用inner join的话,你可以写查询语句:

SELECT count(p)From Post p JOIN p.createdByUser u

问题是,这条查询会返回所有的由createdByUser字段指定用户创建的所有帖子的数量。如果你想知道每个用户创建了多少帖子,你必须使用GROUP BY操作符:

SELECT u,count(p)From Post p JOIN p.createdByUser u GROUP BY u

WHERE,GROUP BY,HAVING

这条查询语句会返回一个User实例和他所创建帖子的数量。为了进一步缩小结果范围,你可以使

用HAVING过滤分组信息(由GROUP BY标志)。下面的查询会返回User实例及他所发的帖子数量,

前提是用户的密码是8个以上的字符。

SELECT u,count(p)From Post p JOIN p.createdByUser u GROUP BY u

HAVING length(u.password)>8

条件表达式(CONDITIONAL EXPRESSIONS)

条件表达式可以用在一个JPQL查询的WHERE和HAVING语句中。你必须了解使用条件表达式时的

一些约束。

?条件表达式中包括LOB状态字段可能无法在数据库之间进行移植。

?字符串使用单引号字符串包裹,如'this'。如果要在查询中使用单引号,就要两个一起使用。你无法在查询中使用Java转义方法(例如,\'代表单引号)。布尔(Boolean)字符用TRUE和FALSE表

示(不区分大小写),数字字符遵从Java规范,不支持日期字符串。同样可以支持Enum,但是你

必须使用Enum,全路径名称,如,com.sourcebeat.jpa.model.FTPType。

?标识变量必须出现在一个SELECT或DELETE查询的FROM语句中。如果使用UPDATE,那么标识变量就必须在UPDATE语句中。标识变量往往表示他们所定义的实体类型,而不能表示一个

集合中的实体。

?你可以使用位置或者命名形式的输入参数,但不能在某一查询混合使用这两种形式。输入参数可以出现一个查询的WHERE语句和(或者)HAVING语句中。

?位置形式参数的格式是以一个问号(?)打头紧跟一个以1开始的正整数。例如,?1。你可以在

一个查询中多个使用同一位置参数,如下所示。

SELECT u FROM User u WHERE u.dateCreated=?1OR u.dateUpdated=?1

?命名形式的参数用一个冒号(:)加一个Java标志符如Java变量名来表示。命名参数表示如下:

SELECT u FROM User u WHERE u.dateCreated=:aDate OR u.dateUpdated=:aDate

函数与表达式(FUNCTIONS AND EXPRESSIONS)

JPQL支持函数功能,多种的IN,LIKE和BETWEEN样式表达式,及面向集合(collection)的条件表达

式。这一节详细讨论写查询可用的各种选择。

一个查询语句中操作符的优先级为:

?导航操作符(.)

?一元符号(+,-)

?乘(*),除(/)

?加(+),减(-)

?比较操作符,=, >, >=, <, <=,<> (不等), [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF]

?逻辑操作符,NOT, AND, OR

BETWEEN

你可以用BETWEEN操作符指定一个实体字段的范围。BETWEEN的语法是:

expression[NOT]BETWEEN expression AND expression

这里expression可以是一个字符串,算术或日期时间表达式。这里有几个使用BETWEEN操作符

的实例。

SELECT u FROM User u WHERE u.dateCreated between:startDate AND:endDate

SELECT t FROM Topic t WHERE t.postCount NOT BETWEEN?1AND?2

IN

你可以利用IN比较操作符指定为一个状态字段指定一系列的值。你可以列出一个或多个字符串或

参数值(基于位置或命名的),或者利用子查询动态的生成一系列的值。字符型,数字型,枚举型

的状态字段可以用在IN操作符上。状态字段的类型必须与列表中的值的类型一致。IN操作符的语

法为:

state-field[NOT]in(item{,item2}*|subquery).

这里有几个例子。

SELECT f FROM Forum f WHERE f.type IN(?1,?2)

SELECT f FROM Forum f WHERE f.type IN(1,2)

LIKE

LIKE允许你根据部分值搜索字符串字段。JPQL用一个下划线(_)表示你搜索字符字符串中任一字

符。在查询语句中可以用百分号(%)表示一系列字符,其它的字符代表他们本身。LIKE的一般格

式为:

string-expression[NOT]LIKE pattern[ESCAPE escape-char]

如果你必须在查询语句中使用下划线或百分号作为字面字符,使用ESCAPE格式。例如,你可以

用forum.description like‘QA\_%’ESCAPE‘\’。你必须在下划线或百分号前加入反

反斜线符号人,并且在搜索字符串后面加入ESCAPE‘\’语法。这里列出几个例子:

?‘tr_ck’可以匹配‘truck’和‘trick’, 但不能匹配‘trucker’。

?‘tr%’可以匹配‘truck’, ‘tractor’, ‘trick’, 等等。

?‘tr_ck%’可以匹配‘truck’, ‘trick’, 和‘trucker’。

如果你想搜索字符串_hello,你的查询语句应该是这样的:

‘\_hello’ESCAPE‘\’

ESCAPE‘\’告诉数据库,“我正在一个转义字符('\')上使用反斜线”。下面用代码表示:

em.createQuery("SELECT f FROM Forum f"+

"WHERE f.description LIKE'\\_%'ESCAPE'\\'");

在这段代码中,你使用了两个反斜线。第一个是为了Java编译器,第二个是由于JPQL解析器。

如果在MySQL数据库上执行上面的ESCAPE查询语句,你可能会得到一个数据库异常。默认情况

下,MySQL会将反斜线识别成一个转义符号,所以它告诉你像处理转义符号那样处理反斜线是错

误的。为了使你的查询能在不同数据库之间进行移植。你必须在JDBC连接中对所有MySQL关闭所

有MySQL数据库实例上的反斜线转义功能。要在你的JDBC连接上禁用反斜线转义,将下面的URL

中的sessionVariables部分添加到你的JDBC连接中。

jdbc:mysql://localhost:3306/db?sessionVariables=sql_mode=NO_BACKSLASH_ESCAPES 更多信息,请参考MySQL文档。

IS NULL

IS NULL比较操作符能够让检测NULL字段,不管是单值路径表达式还是输入参数。你可以使用

IS NOT NULL来确保一个单值路径表达式有非空值,或者使用IS NULL来检测NULL值。

SELECT p FROM PrivateMessage p WHERE p.dateRead IS NOT NULL

//toUser references a many-to-one relationship,so you can use IS[NOT]NULL SELECT p FROM PrivateMessage p WHERE p.toUser IS NOT NULL

//this query does not work because we are using a

//collection-value path-expression

SELECT f FROM Forum f WHERE f.topics IS NULL

IS EMPTY

IS[NOT]EMPTY操作用于空或者非空的集合值表达式。

//the above query rewritten to use IS EMPTY

SELECT f FROM Forum f WHERE f.topics IS EMPTY

//this query will find all forum entities with topics

//(i.e.the collection is not empty)

SELECT f FROM Forum f WHERE f.topics IS NOT EMPTY

MEMBER

可以用[NOT]MEMBER[OF]来判断一个实体是否是一个集合的一部分。[OF]是可选的,不影

响MEMBER比较操作符。你可用可不用。

可以用NOT MEMBER来判断一个实体不是一个集合的组成部分。MEMBER的语法如下:

Expression[NOT]MEMBER[OF]collection-valued path-expression

//find the forum instance that contains Topic t

Query q2=em.createQuery("SELECT f FROM Forum f"+

"WHERE:topic MEMBER f.topics");

q2.setParameter("topic",t);

List results2=q2.getResultList();

字符串函数(STRING FUNCTIONS)

JPQL查询的WHERE或HAVING语句中支持字符串函数作为函数表达式。

?CONCAT(string1,string2):将字符串2追加到字符串1。

?SUBSTRING(string,starting position,length):从字符串string开始位置starting position截取长度为length字符。

?LOWER(string):将一个字符串string转换成小写形式。

?UPPER(string):将一个字符串string转换成大写形式。

?LENGTH(string):返回字符串string的长度,为整数。

?TRIM([[LEADING|TRAILING|BOTH][char]FROM]string):去掉字符串string头,尾或两者的字符char。最简形式是TRIM(string),可以去掉字符串string头尾的空格字

符。

?LOCATE(string1,string2[,start]):返回string2在string1的位置。定位函数有一个可选的起始位置start。

数学函数(ARITHMETIC FUNCTIONS)

JPQL查询的WHERE或HAVING语句中支持数学函数作为函数表达式。

?ABS(arithmetic expression):返回算术表达式的绝对值。

?SQRT(arithmetic expression):求算术表达式的方根,返回一个Double。

?MOD(arithmetic expression1,arithmetic expression2):求参数1与参数2的模,返回一个整数。

?SIZE(collection-valued path-expression):计算一个集合中元素的数量,并返回一个整数。如果集合为空,返回0。

时间函数(DATETIME FUNCTIONS)

支持以下时间函数。

?CURRENT_DATE:当时日期,由数据库决定。

?CURRENT_TIME:当时时间,由数据库决定。

?CURRENT_TIMESTAMP:当时日期和时间,由数据库决定。

SECLECT函数

SELECT语句标识查询结果。SELECT语句包含一个或多个下列元素。

?一个路径表达式或是标识变量:表明返回一个实体。

?一个单值路径表达式:指定返回一个字段或实体。

?一个统计SELECT表达式:表明返回计算结果(如,COUNT(*))。

?一个构造器表达式:允许你从选择的条目中返回一个对象。

SELECT语句允许查询各种实体,计算结果,投影值,非实体类。你可以在SELECT语句中使用集

合值的路径表达式,然而,下面表达是非法的。

SELECT f.topics FROM Forum f

前面已经提供,一些JPA的实现允许这类的查询。为了保持移植性,你应该使用下面的语句替换

(参看Joins一节)。

SELECT t FROM Forum f JOIN f.topics t

查询的结果可以是一个抽象模型类型,一个状态字段(实体的字段或属性),一个统计函数的结果,

由NEW操作符创建的对象,或任何它们可能的组合。如果你查询一个抽象模型类型或是构建一个

新的对象,查询结果会是实体类型的对象组成的列表或一个新对象。如果你使用了统计函数,查

询状态字段,或是不同的类型,返回结果是一个数组(Object[])实例的列表。数组中对象的位置与

你在查询语句中指定的位置一致。例如。

SELECT t.subject,t.content FROM Topic t

这个查询返回一个数组(Object[])实例组成的列表。这个列表中每个项目包含两个String对象,第

一项目(index 0)是标题,第二个(index 1)是主题的内容。

构造器函数(CONSTRUCTOR EXPRESSION)

你可以创建一个新的对象作为查询结果。这个对象不要求是实体,但要有一个构造器,它的顺序

与类型与SELECT语句一致。下面是一个封装用户统计数据的临时对象。

public class UserStatistics{

private String username;

private Integer userId;

private long postCount;

public UserStatistics(String username,Integer userId,long postCount){

super();

https://www.360docs.net/doc/5d855257.html,ername=username;

https://www.360docs.net/doc/5d855257.html,erId=userId;

this.postCount=postCount;

}

//getter methods removed for readability

}

下面的查询语句会计算系统中每个用户的发帖数量,并将结果,用户名,用户ID保存到一个临时

对象UserStatistics中。

Query q=em.createQuery("SELECT NEW https://www.360docs.net/doc/5d855257.html,erStatistics("

+"https://www.360docs.net/doc/5d855257.html,ername,u.id,COUNT(p))“

+“FROM Post p JOIN p.createdByUser u"

+"WHERE p.parent IS NOT NULL GROUP BY u");

List results=q.getResultList();

统计函数(AGGREGATE FUNCTIONS)

SELECT语句中可以使用以下统计函数(在一个路径表达式上应用)。

AVG

计算查询结果返回的数值型参数的平均值,并返回一个Double整型。

SELECT AVG(f.forumPostCount)FROM Forum f

COUNT

计算所找到的实体的总和,并返回一个Long整型。如果没有找到实体,COUNT返回0。

SELECT COUNT(f)FROM Forum f

MAX

计算查询结果作为参数的最大值,返回类型与参数类型一致。MAX函数可以应用到任何可排序的

状态字段上,包括数字类型,字符串,字符类型,或日期。

SELECT MAX(f.forumPostCount)FROM Forum f

MIN

计算查询结果作为参数的最小值,返回类型与参数类型一致。MIN函数可以应用到任何可排序的

状态字段上,包括数字类型,字符串,字符类型,或日期。

SELECT MIN(f.dateCreated)FROM Forum f

SUM

计算查询结果作为数值型参数的总和,当参数是浮点类型时返回一个Double类型,当使用

BigInteger返回一个BigInteger,当参数为BigDecimal时返回BigDecimal。

SELECT SUM(f.forumPostCount)FROM Forum f

使用法则(RULES OF USAGE)

除COUNT外,这些函数必须用在以状态字段结尾的路径表达式上。你可以用一个状态字段,关联

字段,或是一个标志符号变量作为参数用在COUNT函数。

如果SUM, AVG, MIN,和MAX计算的值不存在时,返回一个NULL。

为了避免使用统计函数查询结果的重复,请使用DISTINCT操作符。但是在MAX 和MIN使用

DISTINCT是非法的。另外,在函数计算结果之前已经剔除了NULL值,不管你是否使用了

DISTINCT。

当使用一个构造器表达式组成的SELECT语句,函数的返回类型应该注意。UserAverages对象

的postCount属性是一个Long对象。最初,使用一个int,查询语句运行时,Hibernate会一个

IllegalArgumentException异常,表明UserStatistics与构造器不相符。我意识到COUNT

返回的是一个Long类型对象,更新一下UserStatistics,查询语句就可以正确的运行。

排序(ORDER BY)

ORDER BY允许你对查询结果进行排序。数据库排序比应用程序更有效。要依据集合的顺序,可

以使用ORDER BY操作符。(更多信息参见第三章Entities Part II中@OrderBy注释)

这是一个JPQL查询语句中Order By操作符的所在位置。

select from[where][group by][having][order by]

Order By的语法为:

ORDER BY expression[ASC|DESC]{,expression[ASC|DESC]}*

下面是一些合法的Order By实例。

?SELECT u FROM User u ORDER BY u

?SELECT u FROM User u ORDER BY u.address

?SELECT https://www.360docs.net/doc/5d855257.html,ername,u.id FROM User u ORDER BY https://www.360docs.net/doc/5d855257.html,ername DESC

expression可以是一个标识符号变量,一个单值关联路径,一个状态字段路径表达式。这些查

询语句一一演示了Order By的这些类型。

你必须注意使用Order By操作符的一些限制。

?当使用一个标识符号变量,一个单值关联字段时,你用来对查询进行排序的项目必须是一个可排序的类型,例如数字类型,字符串,字符类型,或是时间日期。

?如果你使用一个状态字段路径表达式,同时它也必须出现在SELECT语句中。

ASC表示升序(由小到大),是默认的排序方式。DESC表示降序排列(由大到小),使用时显式在查询

的Order By语句上添加它。排序的优先级是按罗列的字段从左到右的顺序进行。

不难理解,下面的查询是不合法的,因为它对一个字段进行排序但它却不在SELECT语句中。

SELECT https://www.360docs.net/doc/5d855257.html,ername,u.id FROM User u ORDER BY u.password

批量处理(BULK OPERATIONS)

JPQL提供了一种替代方案,用一条语句更新或删除一个或多个实体。JPQL中批处理支持一次可以

处理一个实体类型(和它的子类)。也就是说,你只能在FROM或UPDATE指定唯一实体。这里是一

个UPDATE查询的语法。

UPDATE abstract_persistence_scheama_name[AS]identification_variable

SET state_field|single_value_association_field=value

{,state_field|single_value_association_field=value}*

value引用必须与你要更新的状态字段或是单值关联字段的类型相同。你可以将下列任意值用于

value。

?一个算术表达式

?字符串

?时间日期(datetime)

?布尔值(boolean)

?枚举类型(enum)

?简单实体表达式

?NULL

DELETE语句看起来如下。

DELETE FROM abstract_persistence_scheama_name[[AS]identification_variable] [WHERE clause]

WHERE语句的语法与SELECT相同(更多信息参见SELECT语句一节)。DELETE操作符只影响FROM

语句指定的实体及其子类。此操作不会级联到任何相关的实体。此外,UPDATE操作符不更新实

体的version一列。

批处理操作最终转换成SQL并在数据库中执行,绕过了持久化环境(persistence context)。当使用一

个事务作用域(transaction-scoped)的持久化环境,会在它们所在事务内执行或在一个事务开始时执

行。

批量操作和扩展的持久化环境(extended persistence context)的组合在管理上有所不同。因为一个扩

展持久化环境不会与数据库同步,直到参与到一个事务中去,你可以有一些实体已经删除了,但

仍可能存在于持久化环境中。

持久化实现通常会在执行批处理操作前禁用一些缓存功能。基于不同的实现,部分或全部缓存功

能会被禁用。频繁的使用批处理操作会影响应用程序的性能。基于这些原因,你应该在它们自己

的事务内或是一个事务开始时执行批处理操作。

实例

当你使用一个UPDATE或是DELETE查询时,你一定会用到Query API提供的方法

--executeUpdate(),来执行更新或是删除操作。如果你使用getResultList()或

getSingleResult(),持久化实现会抛出一个IllegalStateException异常。同样,你用

executeUpdate()来执行一个SELECT查询,持久化实现会抛出一个IllegalStateException

异常。

下面是一些批量更新的例子。

?一个论坛帖子数量的两倍。

Query q2=em.createQuery("UPDATE Forum AS f"

+"SET f.forumPostCount= f.forumPostCount*2");

q2.executeUpdate();

?将所有的Role实体的dateUpdated字段设置为当前日期和时间。

Query q=em.createQuery("UPDATE Role AS r"+

"SET r.dateUpdated=CURRENT_TIMESTAMP");

q.executeUpdate();

?将布尔字(p r u n i n g E n a b l e d))段值设置为t r u e。在a g o r a B B应用程序中,用EntityListener类来设置dateUpdated和updatedByUser字段。version字段是由持久化实现进行管理。避开这些弯弯角角,当你执行批量操作时,你的查询写成更新字段。还有,要注意的是,executeUpdate返回实体更新的数目(删除时返回删除的数量)。

//Assume we already fetched the correct User identified by

//the variable adminUser

Query forumUpdate=em.createQuery("UPDATE Forum AS f"+

"SET f.pruningEnabled=TRUE, f.dateUpdated=CURRENT_TIMESTAMP,"+ "f.version= f.version+1, f.updatedByUser=:user");

forumUpdate.setParameter("user",adminUser);

int entitiesUpdated=forumUpdate.executeUpdate();

你可以将pruningEnabled的值设置为null,将其进行重位。如下所示。

Query pruningReset=em.createQuery("UPDATE Forum AS f"+

"SET f.pruningEnabled=NULL");

pruningReset.executeUpdate();

这条查询设置了enum类型的字段值。你必须使用enum类的长限定词,因为enum不是实体,持久化实现不法获得Status的信息,但它可以识别com.sourcebeat.jpa.model.Status。

Query enumUpdate=em.createQuery("UPDATE Forum AS f"+

"SET f.status=com.sourcebeat.jpa.model.Status.LOCKED"+

"WHERE f.type=com.sourcebeat.jpa.model.FTPType.ANNONUCEMENT");

int enumUpdateCount=enumUpdate.executeUpdate();

这里有几个DELETE操作的例子。

?删除系统中所有无密码的用户(Users)。

Query removeRoles=em.createQuery("DELETE FROM User u"+

"WHERE u.password=NULL");

int rolesRemoved=removeRoles.executeUpdate();

?删除没有主题(Topics)的论坛(Forum)。

Query removeForums=em.createQuery("DELETE FROM Forum f"+

"WHERE f.topics IS EMPTY");

int forumsRemoved=removeForums.executeUpdate();

总结(SUMMARY)

JPQL提供了大量实体查询,分组,排序和总结的功能。包括丰富的关联(join)操作支持和即时读取

延迟关联关系(eagerly fetch lazy relationship)的能力。你已经学习所支持的各种函数和表达式,以及

SELECT语句所能提供的各种选项。本章最后探讨了批量处理操作,它具备使用单条查询语句(实

际是指UPDATE或DELETE语句)影响一个或多个实体的能力。

现在你应该很熟悉了JPQL所能提供的丰富的功能,利用它,从简单到复杂一步步地创建自己的查

询。

SpringBoot整合SpringDataJPA,不用写SQ语句

SpringBoot整合SpringDataJPA,今天没啥事情就看了一下springboot整合springdataJPA,实在 SpringBoot整合SpringDataJPA 1、JPA概念 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0 注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术: ORM映射元数据 JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; API 用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 查询语言 这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合 创建maven工程并导入依赖:(这里用的是sprigcloud2.1.16的)

org.springframework.boot spring-boot-starter-parent 2.1.16.RELEASE org.sprin mysql mysql-connector-java org.springframework.boot spring-boot-starter-test org.projectlombok lombok 2、配置文件application.yml server: port: 9090 spring: application: name: spring-data-jpa datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:///user_db?serverTimezone=UTC username: root password: root #jpa配置 jpa: show-sql: true hibernate: ddl-auto: update 注意: url这里的配置必须要加入serverTimezone=UTC传递时区,不然操作数据库会抛异常的,///代表的是127.0.0.1:3306 本地的可以省略

停车场管理系统要点

北京科技大学计算机科学与技术专业生产实习报告项目名称:物品租赁平台设计与开发 学生姓名:徐松松 班级:计1304 学号:41345053 企业指导老师:邬志君 校内指导老师: 成绩: 地点:大唐移动通信设备有限公司 时间:2016 年7 月20 日

一、生产实习目的与实习要求 1、实习目的 生产实习旨在培养学生的实践能力、分析问题和解决问题的能力以及综合运用所学基础知识和基本技能的能力,同时也是为了增强学生适应社会的能力和就业竞争力。通过理论联系实际,巩固所学的知识,提高处理实际问题的能力。 互联网发展到3.0时代,进入互联网+综合服务的时代。互联网巨头纷纷专注于开发一个联系卖家和买家的平台,而自身不从事这个行业。为了最贴近计算机的生产环境,本次实习目标是开发一个物品租赁平台,个人可以自由发布空余物品。具体实践中以空闲车位作为物品.可以出租空闲车位、也可以租赁别人的空闲车位。通过实际动手开发,掌握JPA、WebService等开发技术,为顺利毕业进行做好充分的准备,并为自己能顺利与社会环境接轨做准备。 2、实习要求 本次生产实习,需要满足以下几点要求: 2.1掌握常用软件开发工具(MyEclipse、TortoiseSVN、Navicat)的使用,掌握根据实际开发需要查找使用工具的能力。 2.2能将具体的计算机知识应用到实际开发工作中,能独立进行工作,将自己的所学所想所感付诸实践,了解新型的软件开发模式,开发思想,开发技术。 2.3.能体会面向对象编程思想,熟悉UML图,能独立创建WebService项目,熟悉数据库设计及JPA开发。

2.4.能够进行团队合作,在团队中承担适合自己的角色,积累沟通经验及提升协作能力。 2.5能深刻体会敏捷开发、持续集成在软件开发中的优点和作用。 二、生产实习设备(环境)及要求 开发环境:win7/Linux/Mac OS 开发工具:MyEclipse2014/Eclipse 开发语言:JA V A JDK1.7 版本库平台:SVN 数据库:MySql 5.7 测试手段:Google Chrom/客户端测试工具 三、实习内容与步骤 1、内容1 (1)实习内容 我在项目中担任代码编写的工作,负责账号管理模块和计费查询模块的制作。首先是账号管理,实现系统的登录功能。 (2)主要步骤 一、登录流程图

Java EE期末考试题及答案 桂电三院

Java EE期末考试 ?填空题: ?Java EE为满足开发多层体系结构的企业级应用的需求,提出_组件-容器________的编程思想。Java EE应用的基本软件单元是_Java EE组件_______. 基本软件单元的运行环境被称为___容器________. ?两层体系结构应用程序分为__客户层_____和____服务器层_____. ?所谓的企业级应用程序,并不是特指为企业开发的应用软件,而是泛指那些为_大型组织部门__创建的应用程序。 ?在三层分布式企业应用程序中,包括_客户层____,__应用服务器层_____,____数据服务器层______三层。 ?Java EE客户端组件既可以是__一个Web浏览器__________、___一个Applet________,也可以是一个__应用程序______. ?Servlet组件在进行重定向时,需要使用ServletResponse接口的方法是__sendRedirect()______. ?httpServletRequest提供了两个方法用于从请求中解析出上传的文件:___Part getPart (String name)___________和__CollectiongetParts()___________。 ?Java EE 6提供的组件主要包括三类:_客户端组件____,__Web组件____,_业务组件____. ?Servlet配置参数保存在__ServletConfig()______________对象中,一个Servlet的该配置对象(能/否)___否(不能)__________被其他Servlet访问。 ?Servlet支持两种格式的输入/输出流:__字符输入/输出流______和__字节输入/输出流_。?MIME的全称是_多媒体Internet邮件扩展____, ServletResponse中响应正文的默认MIME 类型为_text/plain______________, 而HttpServetResponse中的响应正文的默认MIME类型为__text/html_________________. ?PDF文件的MIME类型是__application/pdf________________, Microsoft Word文档的类型是__application/msword___________。在Servlet中设置MIME类型应使用__response__对象的方法_____setContentType()________. ?所有的Servlet都必须实现下面的两个接口之一:__通用Servlet接口______和__HttpServlet接口_________。 ?HTTP协议是一种__无状态____协议,服务器不记录关于客户的任何信息。

springhibernatejpa联表查询复杂查询

Spring Hibernate JPA 联表查询复杂查询 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的?是。如果hibernate认为jpa的注解够用,就直接用。否则会弄一个自己的出来作为补充。 2)jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用? Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可 正文: 一、Hibernate VS Mybatis 1、简介 Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。 iBATIS 的着力点,则在于POJO 与SQL之间的映射

关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现 2、开发对比 Hibernate的真正掌握要比Mybatis来得难些。Mybatis 框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程 3、系统调优对比 Hibernate调优方案: 制定合理的缓存策略;尽量使用延迟加载特性;采用合理的Session管理机制;使用批量抓取,设定合理的批处理参数(batch_size);进行合理的O/R映射设计 Mybatis调优方案: MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis 同样具有二级缓存机制。MyBatis可以进行详细的SQL优化设计。 SQL优化方面: Hibernate的查询会将表中的所有字段查询出来,这一

Java课程学习路线图

Java课程学习路线图【最全】 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。千锋Java课程紧跟热门互联网行业,采用真实企业项目实战,并特设专业技能提升课,让学员保持长足的成长。 第一阶段 1、JavaSE编程基础 DOS常用命令 安装JDK、设置环境变量 DOS系统编译、执行Java程序 Java的注释 标识符、标识符的命名规范 Java 关键字 Java的数据类型 变量的定义及初始化 Java的运算符 表达式 转义字符 运算符的优先级 类型转换 Java分支if...else 多重if、嵌套if

Java switch Switch vs if Java循环for、while 、doWhile 循环的嵌套 break、continue、return 方法的定义 方法的形参和实参 无返回值的方法 有返回值的方法 方法的重载 2、Java数组 Java 数组的定义 数组的静态赋值 数组的动态赋值 数组单个元素的访问 数组的遍历访问 数组的增强for循环 数组的排序 数组的顺序查找 数组的二分法查找 命令行参数args的使用 可变参数的应用

Arrays工具类的使用 二维数组的使用 3、Java面向对象 面向对象的分析与设计 面向对象与面向过程的区别 Java与面向对象 类的定义 对象的定义 类中成员变量及方法的定义 构造方法的定义和调用 构造方法的重载 面向对象的封装特性 this调用属性、方法、构造方法 局部变量和成员变量的作用域问题static静态属性、方法、代码块 工具类的概念及工具类的制作super关键字的使用及理解 Java中访问权限控制机制 继承中构造方法的细节 方法的重写 equals及toString方法的正确理解Java中的包机制

JPA_Basic

JPA 教程 1.JPA概述 JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。 JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,图 1很好地描述了JPA的结构: Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。

JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术: ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 2.实体对象 访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。为了方便后面的讲解,我们用论坛应用为例,建立以下的领域对象: Topic是论坛的主题,而PollTopic是调查性质的论坛主题,它扩展于Topic,一个调查主题拥有多个选项PollOption。这三个领域对象很好地展现了领域对象之间继承和关联这两大核心的关系。这3个领域对象将被映射到数据库的两张表中:

JavaEE简答题

JavaEE简答题修改版(30分,6题*5分) (一)第一章概述 1.三层体系结构的优点有哪些?P2 ①安全性高; ②易维护; ③快速响应; ④系统扩展灵活。 2.两层体系结构的缺点有哪些?p2-3 ①安全性低; ②部署困难; ③耗费系统资源。 3.简述Java EE的“组件-容器”编程思想。(P5,有两点,与填空题第1题互斥) ①JavaEE应用的基本单元是JavaEE组件,所有的javaEE组件都运行在特定的环境中。 ②组件的运行环境被称为容器。 4.Java EE体系结构的优点?p11,4点 ①独立于硬件配置和操作系统; ②坚持面向对象的设计原则; ③灵活性、可移植性和互操作性; ④轻松的企业信息系统集成。 (二)第三章Servlet 5.Servlet的基本工作流程?p21:6点 ①客户端将请求发送到服务器; ②服务器上的Web容器实例化Servlet,并为Servlet创建线程; ③Web容器将请求信息发送到Servlet; ④Servlet创建一个响应,并将其返回到Web容器; ⑤Web容器将响应返回客户端; ⑥服务器关闭或Servlet空闲时间超过一定限度时,调用dertory()方法退出。

6.在创建Web应用程序时,通过Servlet上下文可以实现哪些功能?p61,4点 ①访问Web应用程序资源; ②在Servlet上下文属性中保存Web应用程序信息; ③获取应用初始化参数信息; ④提供日志支持。 7.HttpServletResponse的sendRedirect方法与RequestDispatcher的forward方法有什么区 别?p68:3点 ①从操作本质上,RequestDispatcher.forward()是容器控制权的转向,在客户端浏览器的地址栏中不会显示出转向后的地址,而sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求连接。 ②从性能上,前者仍是在同一次请求处理过程中,后者是结束第一次请求,由浏览器发起一次新的请求。因此前者更高效。 ③从跳转的范围上,HttpServletResponse()能够跳转到其他服务器上的资源,而RequestDispatcher.forward()只能转向Web应用内部的资源。 8.Filter的主要用途是什么?p69: 3点 ①访问特定资源时的身份验证; ②访问资源的记录跟踪; ③访问资源的转换。 (三)第四章JSP 9.列举JSP的5个内置对象,并做简要说明。 答:request、response、out、session、application、config、pageContext、page、exception (任选5个,并用一句话说明) ①request对象:代表来自客户端的请求,它封装了用户提交的信息; ②response对象:代表服务器对客户端的响应; ③out对象:代表向客户端发送数据的对象; ④application对象:代表运行在服务器上的Web应用程序,相当于Servlet上下文; ⑤exception对象:用来处理JSP文件在执行时所有发生的错误和异常。 10.与response.sendRedirect()实现重定位有何不同?p114 response.sendRedirect()其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,在浏览器上的地址栏上可以看到地址的变化; 而则不同,它是直接在服务器端执行重定位的,浏览器并不知道。

jpa查询语言

JPA查询语言(JPQL) JPQL,SQL和批量处理 白汉奇[译] 目录 概述 (1) 类型 (2) 保留标志符 (4) 路径表达式 (4) 界定变量(Range Variables) (6) JOINS (6) INNER JOIN (7) LEFT OUTER JOIN (7) FETCH JOIN (8) WHERE,GROUP BY,HAVING (10) 条件表达式(CONDITIONAL EXPRESSIONS) (10) 函数与表达式(FUNCTIONS AND EXPRESSIONS) (10) 字符串函数(STRING FUNCTIONS) (13) 数学函数(ARITHMETIC FUNCTIONS) (13) 时间函数(DATETIME FUNCTIONS) (14) SECLECT函数 (14) 构造器函数(CONSTRUCTOR EXPRESSION) (15) 统计函数(AGGREGATE FUNCTIONS) (15) 使用法则(RULES OF USAGE) (16) 排序(ORDER BY) (16) 批量处理(BULK OPERATIONS) (17) 实例 (18) 总结(SUMMARY) (20) 本章探讨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)”,而不是数据库定义的物理模型。抽象持久化模型

jee考试题带答案

西北农林科技大学本科课程考试试题(卷) 2012—2013学年第1学期《J2EE技术》课程A卷专业班级:命题教师:审题教师: 学生姓名:学号:考试成绩: 本试卷由笔试和机试两部分组成。一到三题为笔试部分,第四题为机试部分 一、选择题(每题3分【按空分配分数】,共30分)得分:分 1. 相比于Spring,基于EJB的Java EE技术作为企业级应用解决方案的主要优势体现在(),使得开发出的应用是可向外伸缩的 (scale-out)。 A. 安全性 B. 运行的时空效率 C. 事务处理能力 D. 支持分布的能力 企业级的与普通javabean的区别是企业级的不仅可以供本地客户端访问,还可以供远程客户端访问。本质区别是访问者和被访问者是否位于同一台虚拟机上。 2.消息服务 (Message Service) 与方法调用 (Method Invocation)两者的最大区别就是:消息服务还可以实现()、()以及异构系统集成。 Java消息服务(JMS)是一个消息标准,它允许javaEE应用程序组件生成、发送、接收和读取消息。它能够进行分布式的、松耦合的、可靠地、异步的信息交流。 A. 异步 B. 业务调用 C. 松耦合 D. 消息传递 3. 关于无状态会话bean和有状态会话bean中“状态”说法正确的是()。 A. 有状态会话bean实例有对应的生命周期,而无状态会话bean则没有 B. 有状态会话bean可维持同一个客户端的多个调用之间的状态信息,无状态会话bean则不能 C. 有状态会话bean可以实现业务对象的持久化,无状态会话bean不能 D. 有状态会话bean可以维护HTTP客户端的状态,无状态会话bean不能 4.JPA实体之间的关系包括一对一、多对多、(对多一)和(一对多)共四种关联关系,以及( D )关系。 Java Persistence API java持久化,实体类表示对象,是对数据库中记录的表示 A. 一对多 B. 多对一 C. 继承 D. 映射 5. 判断访问EJB的方式是本地 (local) 访问还是远程 (remote) 访问取决于

Koala优势

企业级应用快速开发工具 ————考拉的几大优势 完整的技术开发解决方案 使用Koala,可以完整的覆盖从项目创建开始,到编码,测试,部署发布,监控等各方面,解决项目开发的技术问题 Koala包含以下组件: 向导式项目定制与生成,不用再去整合各种技术,写大量配置,只需轻松定制,生成全新项目 丰富的组件,包含缓存,国际化,异常机制,FTP,EXCEL读取等,这些都是在大量的项目实践的基础上提取出来的组件,具有较高的重用性 向导式的增删改查的功能实现,实体的增删改查经常是非常重复的工作,现在K oala为你提供了向导式的生成且生成原生的java,jsp等,没有侵入性。 权限子系统,你可以立刻使用Koala的权限子系统,基于RBAC3模型的以用户,角色,资源为核心的关系而建立,可以控制任意URL,方法,按钮,图片等。 流程子系统,基于JBPM5的流程平台,包含流程设计平台与流程引擎平台,你只须关注如何设计一个流程,其它的平台为你解决。 监控子系统,为你监控http请求,看到请求最多或最耗时的业务;为你监控方法,请求最多或最耗时或异常的方法;为你监控数据库资源,连接池健康状态监控以及 SQL监控,还有更多的监控 方便的测试支持,无须关心任何细节与测试的配置,开发人员只专注于业务测试,不需要搭建任何测试支持环境; 统一的代码风格约束,基于checkstyle及pmd的代码检查集成,包含针对开发人员的eclipse插件以及针对检查人员或上级领导的代码质量报告,轻松约束整个项目 组的代码风格规范 透明的部署机制:只需开发一次,你可以轻松的把你项目中的服务发布成soap webservice,restful webservice以及EJB,还可以把项目发布成WAR+EJB或WAR两 种部署形式。这些都是向导式的过程,无须开发人员进行任何代码的修改,Koala 为你生成新的源码及发布包。 WS的安全机制,使用koala发布的Webservice,你立刻就可以获得基于IP过滤及用户名密码验证,方法级权限控制的webservice安全机制,发布便集成,无须任 何开发。 从数据库到实体的自动化生成过程,同样是向导式的,节省大量时间 通用查询组件,项目中的一些查询需求,你只需要通过通用查询组件轻松定制就可,方便快捷 持续集成支持,从Koala创建项目开始,你可以立刻获得包含bug管理,每日构建以及svn,git版本管理支持功能。

JPA学习笔记

目录 目录 (1) 一、JPA基础 (2) 1.1JPA基础 (2) 1.2JPA开发过程 (3) 1.3 实体的生命周期及实体管理器常用方法 (4) 二、环境搭建 (5) 2.1 添加JPA支持 (6) 2.2 添加配置文件 (6) 2.3测试配置 (6) 2.4 环境搭建附表 (6) 三、常用注解 (12) 3.1 批注完全参考 (12) 3.2 ID相关的 (12) 3.3主键生成策略 (13) 3.4字段、添加字段、添加表关联 (13) 3.5映射相关 (14) 3.6其他 (14) 四、JPA映射 (14) 4.1一对一映射 (15) 4.1.1共享主键映射 (15) 4.1.2关联外键映射 (17) 4.1.3添加表关联 (17) 4.2一对多关联 (18) 4.2.1添加字段的一对多、多对一关联 (18) 4.2.2添加表的一对多、多对一关联 (19) 4.3多对多关联 (20) 4.4继承映射 (21) 五、JPQL (21) 六、常见异常 (22)

一、JPA基础 1.1 JPA基础 JPA:java persistence api 支持XML、JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 实体:entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字 游离状态实体以值方式进行传递,需要serializable JPA是一套规范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate 就行 oracle可以用toplink) JPQL 1、与数据库无关的,基于实体的查询语言 2、操作的是抽象持久化模型 3、JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型 4、EJBQL的扩展 5、支持projection(可以查询某个实体的字段而不需要查询整个实体)、批量操作(update、delete)、子查询、join、group by having(group by聚合后 having 聚合函数比较条件) 弱类型语言:没有明显的类型、根据情况变化、容易出错 强类型语言:没个变量都有固定的类型。不容易出错 虽然JPA规范中明确表示无法访问一个集合关系字段 抽象模型类型:JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型状态字段 关联字段

EJB3 JPA 调用原生SQL 和 函数 存储过程

1. 调查JPQL如何使用原生SQL …………….//创建EntityManager em List users = em.createNativeQuery("SELECT * FROM USER").getResultList(); for(int i=0;i< users.size();i++){ Object[] object = (Object[])users.get(i); for(int j=0;j9980) order by cid desc; 执行时间0.03秒 2.按分析函数来分 select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980; 执行时间1.01秒 3.按ROWNUM来分 select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where rn>9980;执行时间0.1秒 其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录 个人感觉1的效率最好,3次之,2最差

JPA开发文档(大全)

JPA开发文档(大全) 这是一份比较全面的JPA文档,希望能够帮助大家,让大家更好的学习工作。 1.发展中的持久化技术 3 1.1 JDBC (3) 1.2 关系对象映射(Object Relational Mapping,ORM) (3) 1.3 Java 数据对象(Java Data Object,JDO) (3) 1.4 Java Persistence API(JPA) (3) 2.JPA 体系架构 (5) 3.Entity Bean (7) 3.1定义对Entity中属性变量的访问 (7) 3.2 主键和实体标识(Primary Key and Entity Identity) (9) 4.EntityManager (10) 4.1 配置和获得EntityManager (10) 4.2 Entity的生命周期和状态 (10) 4.3 持久化Entity(Persist) (11) 4.4 获取Entity (13) 4.5 更新Entity (13) 4.6 删除Entity (13) 4.7 脱离/附合(Detach/Merge) (14) 5.JPA Query (14) 5.1 Query接口 (15) 5.2 简单查询 (15) 5.3 使用参数查询 (16) 5.4 排序(order by) (16) 5.5 查询部分属性 (17) 5.6 查询中使用构造器(Constructor) (17) 5.7 聚合查询(Aggregation) (18)

5.8 关联(join) (19) 5.9比较Entity (20) 5.10 批量更新(Batch Update) (21) 5.11批量删除(Batch Remove) (21) 1.发展中的持久化技术 1.1 JDBC 很多企业应用的开发者选择使用JDBC 管理关系型数据库中的数据。JDBC支持处理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供SQL 查询语言查找数据。JDBC 所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去开发将面向对象特性(比如:类之间的继承)和关系型数据库进行映射的专有解决方案。 1.2 关系对象映射(Object Relational Mapping,ORM) ORM 是目前完成对象和关系数据表之间的映射最好的一种技术,这些ORM 框架处理对象和关系数据库之间的协调工作,将开发者从这部分工作中解脱出来,集中精力处理对象模型。阻碍ORM 发展的问题是,现有的每一种ORM 产品都有自己特有的API,开发者只能将自己的代码绑定到某一个框架提供商的接口上,这种状况形成了厂商锁定,意味着一旦该框架提供商无法解决系统中出现的严重错误,或者因为其它的原因转而采用其它的框架,将会给开发者的企业应用带来极大的困难,唯一的解决办法是重写所有的持久化代码。 1.3 Java 数据对象(Java Data Object,JDO) JDO 是Java EE 标准中另外一个支持管理持久化数据的规范,JDO 规范使用和JPA 非常类似的API,只是通常是通过JCA 技术集成到应用服务器上。但是JDO 是针对轻量级容器而设计的,不能够支持容器级别的声明式安全、事务特性,也无法对远程方法调用提供支持。 1.4 Java Persistence API(JPA)

JavaEE学习心得与总结

学习Java EE心得体会 这学期通过对Java EE五部分的学习,掌握了 java的基本开发方法, 学习JavaEE基础部分分为6大部分,分别是基础服务,Java Web开发,Web Service, JSF框架,EJB部分和JPA。 其中第一部分是基础服务部分,此部分包括六章:第一章是概述,介绍了 java EE的发 展历史,架构,组件,服务,容器等概念,并介绍了平台角色以及开发环境和应用服务的选择与安装。第二章讲了使用 JNDI访问明明和目录服务,介绍了什么是命名和服务目录, 以及如何通过 JNDI访问Weblogic提供的命名目录服务。第三章讲了使用JDBC访问 数据库,介绍了 JDBC的基本用法以及连接池的配置和访问。第四章讲了使用JTA进行事 物处理,介绍了事物处理概念以及如何通过JTA进行事务处理。第五章RMI :远程方法 调用,介绍了 RMI的结构以及如何使用 RMI进行编程。第六章,使用JMS接发消息,介绍了消息服务的概念,在Weblogic中消息服务相关的配置以及如何通过JMS开发消息发送 和接受程序。 J2EE是一种技术,旨在简化企业应用程序的设计和实施。在本教程中,您将学习 J2EE是什么,它的好处,J2EE的主要组成部分,企业应用框架的演变,为什么要使用 J2EE,J2EE平台架构,J2EE API和技术和J2EE参考实现。在继续之前,我们的J2EE讨论让定义企业应用程序是什么。企业应用程序是一个应用程序, 它可能要继续使用他们,同时添加或迁移到一个新的利用互联网,电子商务等新技术的应用, 集传统的现有应用程序和数据库。 Java EE架构分为四层,客户端层,Web层,EJB层和数据库层,其中,数据 库层为系统提供数据存储和数据库管理功能,在整个企业级应用中可能村爱很多个数据库,并且采用不同类型的数据库管理系统进行管理。EJB层也称为业务逻辑层,用于完成系统中复杂的或者共享的业务,这些功能主要是提供客户端层和Web层调 用,用户不会直接调用该层。Web层是基于HTTP的访问方式,客户通过Web层 访问系统的业务逻辑和数据等。客户端层包括Applet客户端和Application客户端,客户通过客户端的形式访问系统的业务逻辑和数据等。逻辑中的四层可能不同时出 现在系统中,例如某个系统可能只提供Web形式的客户端,并且不使用EJB技术, 此时系统图只留下Web层和数据库层。 Java运行环境定义了五种类型的应用组件,包括客户端组件 Application和Applet,Web 层组件JSP和Servlet,EJB组件等,这些组件类型是 Java EE产品必须支持的。 其中的JPA是我学习的重点。JPA包括以下3方面的技术:(1). ORM映射元数据,JPA 支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中?( 2). JPA的API,用来操作实体对象,执行CRUD操作, 框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。(3).查 询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查 询数据,避免程序的 SQL语句紧密耦合。JPA的优势包括:1标准化,JPA是JCP组织发布的Java EE 标准之一,因此任何声称符合JPA标准的框架都遵循同样的架构,提供相 同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA 框架下运行。2对容器级特性的支持,JPA框架中支持大数据集、事务、并发等容器级事务,这使得JPA超越了简单持久化框架的局限,在企业应用发挥更大的作用。3简单易用,集成方便,JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实 体和创建Java类一样简单,没有任何的约束和限制,只需要使用javax.persistence.Entity 进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发 者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器

JPA_Basic

好书 JPA 教程 1.JPA概述 JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。 JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,图 1很好地描述了JPA的结构: Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。

JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术: ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 2.实体对象 访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。为了方便后面的讲解,我们用论坛应用为例,建立以下的领域对象: Topic是论坛的主题,而PollTopic是调查性质的论坛主题,它扩展于Topic,一个调查主题拥有多个选项PollOption。这三个领域对象很好地展现了领域对象之间继承和关联这两大核心的关系。这3个领域对象将被映射到数据库的两张表中:

JPA 各种基本用法

JPA 各种基本用法 JPQL就是一种查询语言,具有与SQL 相类似的特征,JPQL 是完全面向对象的,具备继承、多态和关联等特性,和hibernate HQL很相似。 查询语句的参数 JPQL 语句支持两种方式的参数定义方式: 命名参数和位置参数。。在同一个查询语句中只允许使用一种参数定义方式。 命令参数的格式为:“ : + 参数名” 例: Query query = em.createQuery("select p from Person p where p.personid=:Id "); query.setParameter("Id",new Integer(1)); 位置参数的格式为“ ?+ 位置编号” 例:

Query query = em.createQuery("select p from Person p where p.personid=?1 "); query.setParameter(1,new Integer(1)); 如果你需要传递java.util.Date 或java.util.Calendar 参数进一个参数查询,你需要使用一个特殊的setParameter() 方法,相关的setParameter 方法定义如下: public interface Query { // 命名参数查询时使用,参数类型为java.util.Date Query setParameter(String name, java.util.Date value, TemporalType temporalType); // 命名参数查询时使用,参数类型为java.util.Calendar

相关主题
相关文档
最新文档