使用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执行插入。