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?
我认为这里的解决方案是重新命名你的列名......谁想到在列名中使用'#'的想法? – noone 2014-12-06 14:24:09
不幸的是,这不是一个选项。我们正在处理一个已经存在了20年以上的大型AS400数据库。这是一个我们有几百个表的问题。这是遗留系统的一种非常常见的命名方法。 – 2014-12-06 14:40:35
为什么你不使用jpql而不是原生查询?有特别的原因吗? – bhdrk 2014-12-06 19:03:21