4

有没有办法在未映射的表上使用 java bean 功能?

所以,我有一个只用于读取的表,它永远不会被修改。我只需要查询它来显示数据。但是我不希望在查询未映射的对象时休眠默认的 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;
}

}

道法:

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;
  }
4

3 回答 3

2

您还可以使用构造函数表达式,如下所示:

List<MyClass> dtos = session.createQuery("SELECT NEW com.example.MyClass( e.name, e.data) FROM Entity e").list();

缺点是您还必须创建Entity, 映射表才能查询它。您可以使用注释来完成,因此您不必创建hbm文件。

从技术上讲,这并不完全符合您的要求。我发现它对于映射类似报告的查询很有用,所以也许它就是你要找的。

于 2013-03-19T19:28:48.740 回答
1

您可以使用 NativeCriteria 库(github 上的项目,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));
}

图书馆的官方页面。这个库基于 hibernate session 和 createSQLQuery,但提供了非常干净和简单的 API 来生成动态和复杂的查询,这些查询没有与映射类等效。

您可以在测试模块上看到更多示例(以及与 Spring / Spring Boot 的集成)。

于 2013-08-25T11:56:04.027 回答
0

您可以ResultTransformer为您的查询设置一个。

Hibernate 提供了各种可以将查询结果转换为未映射类型的转换器。例如,AliasToBeanResultTransformer根据所选字段的别名进行转换。

于 2013-03-19T18:39:26.563 回答