Hibernate查询未映射的表

时间:2013-03-19 18:19:26

标签: hibernate object

有没有办法在未映射的表上使用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;
  }

3 个答案:

答案 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会根据所选字段的别名执行转换。