【发布时间】:2023-03-17 00:25:02
【问题描述】:
OpenJPA 1.2.2、WebSphere 7 (Java EE 5)
我正在尝试使用 orm.xml 中定义的 named-native-query 将表映射到 POJO(不是实体!):
<named-native-query name="myNativeQuery" result-class="foo.bar.PojoBean">
<query>
SELECT col_one AS colOne, col_two AS colTwo, col_three AS colThree
FROM myTable WHERE id = 42
</query>
</named-native-query>
PojoBean 是一个带有 String getter/setter 和空参数构造函数的 final 类:
public final class PojoBean implements java.io.Serializable {
public PojoBean() {
}
public String getColOne() { ... }
public void setColOne(String colOne) { ... }
...
}
当我创建查询时:
EntityManager myEntityManager = ...
myEntityManager.createNamedQuery("myNativeQuery");
我遇到了一个异常(为便于阅读而格式化):
<openjpa-1.2.2-r422266:898935 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException:
Result type "class foo.bar.PojoBean" does not have any public fields or setter methods for the projection or aggregate result element "null",
nor does it have a generic put(Object,Object) method that can be used,
nor does it have a public constructor that takes the types null.
这是什么意思?
更多信息:
- PojoBean 的实现无法更改,并且作为 final 类也无法扩展。
- 使用 EntityManager.createNativeQuery(...) 从 java 运行查询是可行的,但这不是一个选项。
谢谢,
【问题讨论】:
-
你有一个顽固的二传手吗?类似于 setValue(String val) setVatue(Integer val)。如果您的查询返回 null,则可能是 abigiuos,应该调用哪个 setter。
-
没有模棱两可的二传手。如果我在 Java (EntityManager.createNativeQuery(...)) 上编写查询而不是使用 orm.xml 它可以工作。
-
为了咯咯笑,你能试着让你的 POJO 不是最终的吗?另外,您的 orm sn-p 显示您的查询是本机查询,您为什么不调用 createNativeQuery(...)?
-
我也尝试将 POPJO 设置为非决赛,但没有运气。我不想使用 createNativeQuery(...):查询存储在 orm.xml 中并根据某些参数调用(“约定优于配置”)