我有(非Hibernated)数据库表,其中包含Hibernate实体的ID。我可以查询它们(使用createSQLQuery
),它给了我id,然后我可以从中加载实体。
我想一步到位,我想我可以用addEntity
做到这一点,但我不确定究竟是多少。 (Hibernate的文档网站已关闭。再次。)当实体表的所有列都存在时,我可以使用addEntity
,但我现在只有id。
这抱怨缺少的栏目:
return (List<MyEntity>) session.createSQLQuery(
"select entity_id from the_table where foreign_key_value = ?")
.addEntity("entity_id", MyEntity.class)
.setLong(0, foreignKey).list();
答案 0 :(得分:1)
我想你想要这样的东西:
session.createSQLQuery("select {entity.*} from entity_table {entity} where ....")
.addEntity("entity", Entity.class).(bind-parameters).list();
Hibernate会将“{entity。*}”扩展为entity_table的相关列。
虽然如果你已经有了ID,你可以简单地使用session.load()将它们转换为实际的实例(好吧,延迟加载代理)。
答案 1 :(得分:0)
我会使用连接
select *
from entity_table
where entity_id = (select entity_id
from non_hibernate_table
where id = ?)
答案 2 :(得分:0)
对于oracle方言。如果你将数据库列类型映射到java数据类型有问题你可以手动设置它:.addScalar("integerFieldName", Hibernate.INTEGER)
public class LookupCodeName
{
private String code;
private String name;
/*... getter-setters ... */
}
public class someBL {
public List<LookupCodeName> returnSomeEntity() {
SQLQuery sqlQuery = (SQLQuery)((HibernateSession)em).getHibernateSession()
.createSQLQuery( "SELECT st.name as name, st.code as code FROM someTable st")
.addScalar("code")
.addScalar("name")
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class));
}
return (List<LookupCodeName>)sqlQuery.list();
}