使用sql查询在hibernate中创建一个新的对象实例

我试图使用查询在hibernate中创建一个对象,然后将其保存回表示该类的表中。

摘自hbm.xml文件:

   MY_SEQ       SELECT MY_SEQ.nextval ID, 'something' VAL from DUAL  

测试用例的代码片段:

 MyClass myClass = (MyClass) session.getNamedQuery("myQuery").list().get(0); Transaction t = session.beginTransaction(); session.save(myClass); t.commit(); 

我的目标是,现在应该在表MY_TABLE中有一个新记录,但插入不会发生,我认为这是因为Hibernate不知道实例没有在db中持久存在。

我试过将查询更改为:

 SELECT NULL ID, 'something' VAL from DUAL 

但这导致Hibernate没有实例化对象。

那么如何从与该类的持久化实例无关的查询创建一个新的对象实例,并使用它来创建一个持久化的实例?

更新:我测试了下面建议的方法,我无法让它适用于这个特定的场景,Hibernate希望你为所有属性选择列,而我们肯定不需要id。 但是,使用ResultTransformer确实有效:

16.1.5。 返回非托管实体

可以将ResultTransformer应用于本机SQL查询,从而允许它返回非托管实体。

 sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") .setResultTransformer(Transformers.aliasToBean(CatDTO.class)) 

此查询指定:

  • SQL查询字符串
  • 结果变压器

上面的查询将返回已实例化的CatDTO列表,并将NAME和BIRTHNAME的值注入其相应的属性或字段中。

该文档提到了返回非托管实体,但它也适用于实体(没有理由不起作用),我可以成功地persist瞬态实体。

也可以看看

  • Hibernate 3.2:用于HQL和SQL的变换器

为了清楚起见,我要留下最初的答案。


也许以下内容会有所帮助:

16.1.2。 实体查询

上面的查询都是关于返回标量值,基本上返回结果集中的“原始”值。 以下显示如何通过addEntity()从本机sql查询中获取实体对象。

 sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class); sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class); 

此查询指定:

  • SQL查询字符串
  • 查询返回的实体

假设Cat被映射为具有列ID,NAME和BIRTHDATE的类,上述查询将返回List,其中每个元素都是Cat实体。

如果实体与多对一映射到另一个实体,则在执行本机查询时还需要返回此实体,否则将发生数据库特定的“未找到列”错误。 使用*表示法时会自动返回其他列,但我们更喜欢明确,如下例中的多对一狗:

 sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class); 

这将允许cat.getDog()正常运行。

但是我不认为你应该设置ID,如果你想保存它并希望Hibernate执行插入。