有没有办法在未映射的表上使用java bean功能?
所以,我有一个仅用于读取的表,它永远不会被修改。我需要查询它才能显示数据。但是我不希望在查询未映射的对象时hibernate默认的Object []返回类型。我想将结果检索到自定义类型的集合中。但我必须创建hbm文件才能执行此操作。反正只是创建自定义类型而没有hbm文件?
加载结果的Businessobj方法:
loadResults()
{
String qry = "select col1, col2 from table";
List<CustomType> result = (ArrayList<CustomType>) dao.HQLWithTransformer(qry, new CustomTransformer());
}
自定义变压器:
public class CustomTransformer implements ResultTransformer {
@Override
public Object transformTuple(Object[] rowdata, String[] arg1)
{
return new CustomType(String.valueOf(rowdata[0]),String.valueOf(rowdata[1]));
return null;
}
@Override
public List transformList(List arg0) {
return null;
}
}
DAO方法:
public Collection HQLWithTransformer(String qry, ResultTransformer rt){
List<?> al=null;
try
{
Query q = sess.createQuery(qry);
q.setResultTransformer(rt);
al = (ArrayList<?>)q.list();
}
catch(HibernateException he)
{
log.debug("Hibernate Exception", he);
}
finally
{
sess.close();
}
return al;
}
答案 0 :(得分:2)
你也可以使用构造函数表达式,如下所示:
List<MyClass> dtos = session.createQuery("SELECT NEW com.example.MyClass( e.name, e.data) FROM Entity e").list();
缺点是您还必须创建Entity
,映射表以便查询它。您可以使用注释来完成,因此您不必创建hbm
文件。
从技术上讲,它并不是你所要求的。我发现它对于映射类似报表的查询很有用,所以也许这就是你要找的东西。
答案 1 :(得分:1)
您可以使用NativeCriteria库(Project on github, available on maven central)。示例代码如下所示:
NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias");
c.setProjection(NativeExps.projection().addProjection("alias.column_name"));
c.add(NativeExps.isNull("alias.column_name"));
c.setOrder(NativeExps.order().add("alias.column_name", OrderType.ASC));
CriteriaResult res = c.criteriaResult();
while (res.next())
{
resp.add(res.getLong(0, null));
}
库的{p> Offical page。这个库基于hibernate会话和createSQLQuery,但是提供了非常简洁的API来生成动态和复杂的查询,这些查询没有与映射类相同的。
您可以在测试模块上看到更多示例(以及与Spring / Spring Boot的集成)。
答案 2 :(得分:0)
您可以为查询设置ResultTransformer
。
Hibernate提供了各种可以将查询结果转换为未映射类型的转换器。例如,AliasToBeanResultTransformer会根据所选字段的别名执行转换。