【问题标题】:Using new statement in JPQL request在 JPQL 请求中使用新语句
【发布时间】:2020-04-25 06:39:27
【问题描述】:
我在 JPQL 查询中使用new,如下方式
select
ob.property1,
NEW package1.CustomObject(item, dimension, material, product)
from mainTable ob
LEFT JOIN ....
应用程序在ob.property1 说这是一个意外令牌后抱怨昏迷。似乎您不能在 select 子句中使用带有 new 的多个列。你能帮帮我吗
【问题讨论】:
标签:
sql
hibernate
jpa
jpql
【解决方案1】:
根据this,您有以下选择:
- 将值包装在类型安全的 Java 对象中,该对象将作为查询结果返回。
select new package1.CustomObject(item, dimension, material, product)
from MainTable ...
投影类在实体查询中必须是完全限定的,并且它必须定义一个匹配的构造函数。这里的类不需要映射。它可以是 DTO 类。如果它确实代表一个实体,则结果实例将以 NEW 状态返回(非托管!)。
HQL 支持额外的“动态实例化”功能。
- 查询可以指定返回
List 而不是 Object[] 以获得标量结果。
select new list(item, dimension, material, product)
from MainTable ...
此查询的结果将是 List<List>,而不是 List<Object[]>。
- 将标量包装成
Map
select new map(
item as iName,
dimension as iDimension,
material as iMaterial,
product as iProduct)
from MainTable ...
此查询的结果将是 List<Map<String, Object>>,而不是 List<Object[]>。映射的键由赋予选择表达式的别名定义。如果用户不指定别名,则键将是每个特定结果集列的索引(例如 0、1、2 等)。