JPA查询语言(4)

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)是主题的内容。

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

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();

SELECT

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

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

Double

整型。

SELECT AVG(f.forumPostCount) FROM Forum f

计算所找到的实体的总和,并返回一个

Long

整型。如果没有找到实体,

COUNT

返回0。

SELECT COUNT(f) FROM Forum f

计算查询结果作为参数的最大值,返回类型与参数类型一致。

MAX

函数可以应用到任何可排序的状态字段上,包括数字类型,字符串,字符类型,或日期。

SELECT MAX(f.forumPostCount) FROM Forum f

计算查询结果作为参数的最小值,返回类型与参数类型一致。

MIN

函数可以应用到任何可排序的状态字段上,包括数字类型,字符串,字符类型,或日期。

SELECT MIN(f.dateCreated) FROM Forum f

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

Double

类型,当使用

BigInteger

返回一个

BigInteger

,当参数为

BigDecimal

时返回

BigDecimal

SELECT SUM(f.forumPostCount) FROM Forum f

COUNT

外,这些函数必须用在以状态字段结尾的路径表达式上。你可以用一个状态字段,关联字段,或是一个标志符号变量作为参数用在

COUNT

函数。

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

NULL

为了避免使用统计函数查询结果的重复,请使用

DISTINCT

操作符。但是在MAX 和MIN使用

DISTINCT

是非法的。另外,在函数计算结果之前已经剔除了

NULL

值,不管你是否使用了

DISTINCT

当使用一个构造器表达式组成的

SELECT

语句,函数的返回类型应该注意。

UserAverages

对象的

postCount

属性是一个

Long

对象。最初,使用一个

int

,查询语句运行时,Hibernate会一个

IllegalArgumentException

异常,表明

UserStatistics

与构造器不相符。我意识到

COUNT

返回的是一个

Long

类型对象,更新一下

UserStatistics

,查询语句就可以正确的运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值