JPA是否具有Hibernate SQLQuery.addScalar()的等价物?

时间:2010-11-19 17:16:13

标签: hibernate jpa

我的旧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 个答案:

答案 0 :(得分:2)

帖子Hibernate native query - char(3) column

似乎提供了一个类似的,更短的解决方案,这似乎对我有用:

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

答案 1 :(得分:2)

我知道这是一个非常古老的问题,只是在别人面临问题时回答它

createNativeQuery接受一个参数,该参数指定获取结果的类的类型,因此在您的情况下,您可以将其更改为,

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

答案 2 :(得分: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");

丑陋但它完成了工作:)