JPQL:查询多个列时,哪种对象包含结果列表?

我正在尝试做一些在PHP&Co中很容易的事情:SELECT COUNT(x)as numItems,AVG(y)as average,… FROM Z

在PHP中我会得到一个像[{numItems:0,average:0}]这样的简单数组,我可以这样使用:

echo "Number of Items: " . $result[0]['numItems']; 

通常在JPQL中,您只查询单个对象或单个列并获取Lists类型,例如ListList 。 但是,在查询多个列时,您会得到什么?

你得到一个Object[] (或List )。 从4.8.1 JPA 1.0规范的SELECT子句结果类型部分:

SELECT子句的结果类型由其中包含的select_expressions的结果类型定义。 当在SELECT子句中使用多个select_expressions时,查询的结果是Object[]类型,并且此结果中的元素按照SELECT子句中的规范顺序和每个类型的结果类型的顺序对应。 select_expressions

如果要进行强类型输入,可以在SELECT子句中使用构造函数表达式。 从SELECT子句中的4.8.2构造函数表达式一节:

可以在SELECT列表中使用构造函数来返回一个或多个Java实例。 指定的类不需要是实体或映射到数据库 。 构造函数名称必须是完全限定的。

如果在SELECT NEW子句中指定了实体类名,则生成的实体实例处于新状态。

 SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100 

您还可以使用Tuple并返回一个Tuple ListList ),您可以将其用作Map列表。