JPA + Hibernate:更改createNativeQuery()+ getResultList()行为?

时间:2009-10-13 05:12:42

标签: java hibernate jpa jboss

我要描述的是一些遗留代码。所以有很多我无法触及/改变的东西。

这个伪代码在Jboss 4.0.3中运行良好,

big_messy_sql = "select t1.f1 as somealias, t2.f2 as somehthingelse  from obj1 t1, obj2 t2 where crazy_conditions....";

Query query = entityManager.createNativeQuery(big_messy_sql);


List<Object> results = query.getResultList();

for (Object oRow : results) {
    Object[] r = (Object[]) oRow;
    // Do more crazy stuff

}

所以,它有效。

现在我正在尝试将Jboss服务器升级到5.1.0GA,这将使用更多最新版本的hibernate

15:39:02,089 INFO  [Version] Hibernate Annotations 3.4.0.GA
15:39:02,167 INFO  [Environment] Hibernate 3.3.2.GA
15:39:02,183 INFO  [Environment] hibernate.properties not found
15:39:02,198 INFO  [Environment] Bytecode provider name : javassist
15:39:02,198 INFO  [Environment] using JDK 1.4 java.sql.Timestamp handling
15:39:02,495 INFO  [Version] Hibernate Commons Annotations 3.1.0.GA
15:39:02,511 INFO  [Version] Hibernate EntityManager 3.4.0.GA

然后我得到了这个例外:

12:06:09,031 INFO  [BigDecimalType] could not read column value from result set: id; S0022: Invalid column name 'id'.

我相信这是因为这个版本的hibernate试图将结果集分别映射到类obj1和obj2。这些java类是通过JPA从数据库中正确地从这个应用程序的其他地方检索出来的(即我们确实将所有@Entity,@ Table和@Column等应用于类obj1和obj2。)因为id列是别名的别名这个混乱的查询,ORM失败了。

我的问题出现了:

我可以在任何地方禁用Native Query的自动映射吗?

我想避免整整九码为这个凌乱的野兽定义一个SQL映射。

2 个答案:

答案 0 :(得分:2)

您可以使用createSQLQueryaddEntity来实现此目的,而不是使用SQL映射。查看http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html

答案 1 :(得分:0)

在数据源的连接URL中添加GET_COLUMN_LABEL_FOR_NAME=true

<connection-url>jdbc:sybase:Tds:[hostname]:[port]?GET_COLUMN_LABEL_FOR_NAME=true</connection-url>