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

jpa查询语言5

    博客分类:
  • jpa
阅读更多
class="acronym">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(); this.username = username; this.userId = userId; this.postCount = postCount; } // getter methods removed for readability} 下面的查询语句会计算系统中每个用户的发帖数量,并将结果,用户名,用户ID保存到一个临时对象UserStatistics中。

Query q = em.createQuery("SELECT NEW com.sourcebeat.jpa.model.UserStatistics("+"u.username, 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 u.username, u.id FROM User u ORDER BY u.username DESC

expression可以是一个标识符号变量,一个单值关联路径,一个状态字段路径表达式。这些查询语句一一演示了Order By的这些类型。

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



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

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

ASC表示升序(由小到大),是默认的排序方式。DESC表示降序排列(由大到小),使用时显式在查询的Order By语句上添加它。排序的优先级是按罗列的字段从左到右的顺序进行。

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

SELECT u.username, u.id FROM User u ORDER BY u.password




批量处理(BULK OPERATIONS)
JPQL提供了一种替代方案,用一条语句更新或删除一个或多个实体。JPQL中批处理支持一次可以处理一个实体类型(和它的子类)。也就是说,你只能在FROM或UPDATE指定唯一实体。这里是一个UPDATE查询的语法。

UPDATE abstract_persistence_scheama_name [AS] identification_variableSET 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
分享到:
评论

相关推荐

    JPA查询语言[归类].pdf

    **JPA查询语言详解** Java Persistence API(JPA)是一种标准的Java库,用于管理和持久化Java对象到关系数据库。JPA提供了强大的查询语言——Java Persistence Query Language(JPQL),它允许开发者通过面向对象的...

    jpa查询语言.pdf

    **JPA查询语言(JPQL)**是Java Persistence API中的一个核心特性,它提供了一种面向对象的查询语言,用于在Java应用程序中检索和操作持久化实体。JPQL类似于SQL,但设计的目标是与对象模型更紧密地集成,而不是直接...

    jpa查询详解

    jpa查询详解 JPA(Java Persistence API)是一种 Java 持久层 API,用于处理 Java 对象和关系数据库之间的 Mapping。JPA 查询是 JPA 中的一种重要机制,用于从数据库中检索数据。在本文中,我们将详细介绍 JPA 查询...

    jpa例子jpajpa

    JPQL是一种面向对象的查询语言,类似SQL,但操作的是实体而不是数据库表。Criteria API则提供了一个更强大且类型安全的查询构建方式。 5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行...

    JPA源文件/jpa学习

    **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...

    JPA大全之经典全集

    JPA的官方文档详细介绍了JPA的规范和实现,包括其核心概念、配置、实体管理、查询语言、事务管理以及性能优化等方面。文档通常分为两部分:JSR(Java Specification Requests)文档和API文档。JSR文档定义了JPA的...

    JPA标记语言所需要的jar包

    6. **JPA Query Language (JPQL)**:JPA提供了一种面向对象的查询语言,类似于SQL,但更关注于对象而非表格。JPQL允许开发者用Java类和属性来编写查询,而不是直接使用数据库表和列。 7. **Criteria API**:除了...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    5. **查询(Query)**:JPA提供JPQL和Criteria API两种方式进行数据库查询,它们都是面向对象的查询语言。 通过学习和理解这些JPA实现及其批注,开发者可以有效地利用JPA来简化数据库操作,提高代码的可读性和可...

    Pro JPA2 精通JPA2

    2. **查询语言(JPQL)**:Java Persistence Query Language,一种类似于SQL的语言,用于在JPA中执行查询操作。JPQL支持面向对象的语法,使得开发者能够用更自然的方式表达查询逻辑。 3. **元数据注解**:JPA使用...

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...

    JPA Demo 简单的了解下jpa

    **JPA查询语言(JPQL)** JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; ...

    一个基于原生Java代码查询方式的JPA查询框架.zip

    标题“一个基于原生Java代码查询方式的JPA查询框架.zip”指的是一个使用Java Persistence API(JPA)的查询框架,该框架允许开发者使用原生的Java代码进行数据库查询,而不是依赖于HQL(Hibernate Query Language)...

    jpa

    JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,它是Java类,代表数据库中的表或视图。实体管理器负责与数据库...

    JPA学习中文文档

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

    Gemini JPA 介绍资料

    此外,JPA还包括一个功能强大的查询语言,即JPQL(Java Persistence Query Language)。 2. 在Eclipse RCP中使用JPA时,通常需要处理应用的生命周期和依赖性管理。OSGi环境中的每个模块被称为一个“Bundle”,每个...

    JPA中文解释,JPA的API

    标题中提到的"JPA中文解释"是指对于JPA的概念、原理、使用方法等进行了中文语言的详细解读,这对于中文环境下的开发者来说非常方便,能够更好地理解和应用JPA。JPA的核心理念是对象关系映射(ORM),它将Java对象...

    jpa技术资料包含文档以及ppt

    **JPA查询语言**,即JPQL(Java Persistence Query Language),是JPA提供的一个面向对象的查询语言,类似于SQL,但更加面向对象。JPQL用于从数据库检索或更新实体,支持复杂的查询结构,如选择、聚合、连接、子查询...

    李勇JPA快速入门05_jpa中的查询

    本节我们将深入探讨"李勇JPA快速入门05_jpa中的查询"这一主题,这涵盖了JPA查询机制的基础和核心概念。 1. **基本查询语言:JPQL** Java Persistence Query Language(JPQL)是JPA提供的面向对象的查询语言,类似...

Global site tag (gtag.js) - Google Analytics