例如,我有一个实体
public class Foo {
private String col1;
private String col2;
private String col3;
private String col4;
//getters and setters
}
我想要做的只是select
col3
和col4
。但我已经有一个Foo
构造函数,如下所示:
public Foo (String col1, String col2) {
this.col1 = col1;
this.col2 = col2;
}
因此,我不能为col3
和col4
设置另一个构造函数,因为它将具有相同的签名。
到目前为止,我要完成的是制作一个完整的构造函数,如:
public Foo (String col1, String col2, String col3, String col4) {
this.col1 = col1;
this.col2 = col2;
this.col3 = col3;
this.col4 = col4;
}
但是当我尝试在我的查询中执行以下操作时
SELECT new Foo(null, null, f.col3, f.col4)
FROM Foo f
我得到了
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree
虽然我试试
SELECT new Foo(f.col1, f.col2, f.col3, f.col4)
FROM Foo f
它按预期工作。
修改
我试过
Select f.col3, col4..
并抛出以下错误
org.springframework.dao.InvalidDataAccessApiUsageException: Cannot create TypedQuery for query with more than one return using requested result type [com.lala.entity.Foo]; nested exception is java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [com.lala.entity.Foo]
答案 0 :(得分:8)
你可以尝试(但只是一试)
SELECT new Foo(cast(null as string), cast(null as string), f.col3, f.col4)
FROM Foo f
或查看JPQL的cast()运算符(如果支持)(我不确定)
其他
Session session = entityManager.unwrap(Session.class);
List<Foo> list = session.createQuery("select f.col3, f.col4 from Foo f").list()
这是特定于Hibernate的,并且您不需要为每个投影都使用特定的构造函数;只需创建一个空的构造函数Foo()
(至少受保护,我不记得是否允许私有)并让Hibernate从查询中将值注入col3, col4
(如果cast()
运算符被支持,则您的底层数据库支持该功能。)
答案 1 :(得分:2)
我知道这个问题很老但你也可以做(如果演员不适合你):
String query = "select new Pojo( " +
" trim(:null), " +
" trim(:null), " +
" f.col3, " +
" f.col4 " +
" ) " +
" from Foo as f ";
return em.createQuery(query, Pojo.class)
.setParameter("null", null)
.getResultList();
编辑: JPA在将它们映射到构造函数参数时忽略文字列,因此用trim包装以让JPA知道文字值。