我要描述的是一些遗留代码。所以有很多我无法触及/改变的东西。
这个伪代码在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映射。
答案 0 :(得分:2)
您可以使用createSQLQuery和addEntity来实现此目的,而不是使用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>