JPA有类似于Hibernate SQLQuery.addScalar()的等效方法吗?

3

我的旧Hibernate代码使用类似以下的语句:

session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)

在新项目中,我们使用Hibernate EntityManager(JPA实现)。
那么是否有类似于addScalar()的调用等价项呢?我是否需要像以前一样指定返回列的类型?
例如,如果我不使用addScalar,那么SQL查询结果是否会被缓存?
3个回答

2

这篇文章Hibernate原生查询-char(3)列

提供了一个类似的、更简洁的解决方案,看起来对我有效:

Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);

有没有任何想法如何使用非Hibernate JPA提供程序来完成这个任务? - vikingsteve

2

我知道这是一个相当老的问题,只是回答一下,以防其他人遇到同样的问题。

createNativeQuery接受一个参数,指定获取结果的类别。所以在你的情况下,你可以将其更改为:

val sql = "select distinct story as story from ...";
Query = getEntityManager().createNativeQuery(sql,Story.class);

这个看起来很不错,但似乎对原始类型 / 标量(例如 - Short.class)无效,你知道为什么吗?(未知实体:java.lang.Short) - JRun
将基本类型放入DTO类中。 - kinjelom
它完美地工作了,提到我的DTO具有枚举+自定义序列化程序/反序列化程序。我尝试了4种不同的方法,但当这个解决方案是简单且有效的时候,这些都没有起作用。 - MD TAREQ HASSAN
提到它起作用了,提到我在DTO中使用了@Entity注释只是为了使其工作,因为我尝试了4种不同的方法,但没有一种方法能起作用,而这个解决方案是简单且有效的(利用“@Entity”注释的技巧)。 - MD TAREQ HASSAN

1

我也曾经寻找同样的问题,但在JPA中没有找到任何有用的答案。

哇,已经过去了6个月还没有答案 :)

不确定是否有帮助,但我找到了一个解决方法:

关键是你不能直接转换为SQLQuery,你必须转换为HibernateQuery,然后调用getHibernateQuery,再将结果转换为SQLQuery。

现在来看一下(scala)代码:

val sql = "select distinct story as story from ...";
val q: Query = getEntityManager().createNativeQuery(sql);
//hello nasty hack
q.asInstanceOf[HibernateQuery].getHibernateQuery().asInstanceOf[SQLQuery].addScalar("story", StandardBasicTypes.LONG);
//next, caching  
q.setHint("org.hibernate.cacheable", true);
q.setHint("org.hibernate.cacheRegion", "query.getTopLinks");

虽然不够美观,但却实现了其功能 :)


有没有办法使用非Hibernate的JPA提供程序来实现这个? - vikingsteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接