2014-12-06 64 views
1

我们的数据库包含许多字段,其中包含字段名称中的pound sign (#)。如果我们尝试在JPA中使用本机查询,它将视为# as a parameter。这里有一个例子:英镑登录JPA字段名称

public List<?> getRecordList(String sql){ 
    Query query = getEntityManager().createNativeQuery(sql); 
    return query.getResultList(); 
} 

List<?> r = getRecordList("SELECT VENDOR.\"ve#\", ITEM.\"item#\" FROM ITEM LEFT JOIN VENDOR ON ITEM.\"itemve#\" = VENDOR.\"ve#\"); 

当这样执行,我们收到以下错误:

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3). 
Error Code: 0 
Call: SELECT VENDOR."ve?, ITEM."item? FROM ITEM LEFT JOIN VENDOR ON ITEM."itemve? = VENDOR."ve? 
+1

我认为这里的解决方案是重新命名你的列名......谁想到在列名中使用'#'的想法? – noone 2014-12-06 14:24:09

+0

不幸的是,这不是一个选项。我们正在处理一个已经存在了20年以上的大型AS400数据库。这是一个我们有几百个表的问题。这是遗留系统的一种非常常见的命名方法。 – 2014-12-06 14:40:35

+0

为什么你不使用jpql而不是原生查询?有特别的原因吗? – bhdrk 2014-12-06 19:03:21

回答

1

如果使用JPQL它的工作原理,但本机查询没有。