2013-03-19 136 views
4

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

所以,我有一个只用于读取的表,它将永远不会被修改。我需要查询它只显示数据。但我不希望在查询未映射对象时,hibernate默认使用的Object []返回类型。我想将结果检索到自定义类型集合中。但我将不得不创建hbm文件来执行此操作。无论如何只要创建自定义类型并且没有hbm文件?

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方法:

加载结果

Businessobj方法

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

回答

2

你也可以使用构造函数的表达式,像这样:

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

的缺点是,你也必须创建Entity,以查询其映射表。您可以使用注释执行此操作,因此您不必创建hbm文件。

从技术上讲,它不是你所要求的。尽管我发现它对映射类似报表的查询很有用,所以也许它就是您要查找的内容。

+0

尝试了注释。由于某些原因,注释未被识别。我的classpath有hibernate-jpa-2.0-api-1.0.0.Final.jar,hibernate3.jar(3.5),hibernate-validator-4.0.2.GA.jar。 – sotn 2013-03-19 20:23:22

+0

我能弄清楚为什么注释不起作用。有一些设置问题。 – sotn 2013-03-21 05:51:57

+0

@sotn酷,很高兴你明白了:) – kostja 2013-03-21 08:27:35

0

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

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

+0

创建了一个自定义变压器。我的代码在OP中。我仍然看到表未映射错误。 – sotn 2013-03-19 20:30:09

+0

非映射表只能用SQL查询查询,而不能查询HQL查询。使用'createSQLQuery()'。 – axtavt 2013-03-19 22:10:40

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

Offical page库。这个基于hibernate session和createSQLQuery的库提供了非常干净和简单的API来生成动态和复杂的查询,这些查询不具有与映射类相同的效果。

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