我的旧Hibernate专用代码使用类似
的内容session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)
在新项目中,我们使用Hibernate EntityManager(JPA实现)。
是否有相当于addScalar()的调用?我是否需要像之前一样指定返回列的类型?
例如,如果我不使用addScalar,SQL查询结果会被缓存吗?
答案 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");
丑陋但它完成了工作:)