【问题标题】:openjpa: illegal argument exception for value objectopenjpa:值对象的非法参数异常
【发布时间】:2013-04-30 21:05:13
【问题描述】:

有一个这样的 NamedQuery:

@NamedQuery(name = "getOpakOdeslaniForPartner", query = "select 

新 com.vo.OpakOdeslaniVO(opak.pocetPokusu, opak.idSekvenceOpakovani.idOpakSekvence, opak.idSekvenceOpakovani.sekvence) 来自 GmOpakOdeslani opak, GmPrijemce prij 其中 opak.idTypZpravy.idTypZpravy = :typZpravy 和 opak.idPrijemce = prij 和 prij.idPrijemceTyp.idPrijemceTyp = :typPrijemce"

值对象有一个带有三个参数的构造函数。

有这样的日志(WebLogic 11g,HP-UX):

Caused by: <openjpa-1.1.1-SNAPSHOT-r422266:1172209 nonfatal user error> org.apache.openjpa.util.UserException: There was an error packing the projection and/or aggregate results of the query into result type "class com..vo.OpakOdeslaniVO".  See the nested Throwable exception for details.
    at org.apache.openjpa.kernel.ResultPacker.packUserType(ResultPacker.java:262)
    at org.apache.openjpa.kernel.ResultPacker.pack(ResultPacker.java:225)
    at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:1960)
    at com..service.OpakOdeslani.getOpakOdeslaniForPartner(.java:52)
    at sun.reflect.GeneratedMethodAccessor1516.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

Caused by: java.lang.IllegalArgumentException
    at sun.reflect.GeneratedConstructorAccessor747.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.openjpa.kernel.ResultPacker.packUserType(ResultPacker.java:235) ... 114 more

实际上我觉得卡住了,因为没有 IllegalArgumentException 的解释消息,而且我找不到 GeneratedConstructorAccessor747 类的源代码。任何想法,发生了什么以及如何解决这个问题?估计值对象的构造函数或者类肯定有问题。

谢谢

【问题讨论】:

    标签: constructor openjpa named-query


    【解决方案1】:

    确保opak.pocetPokusu, opak.idSekvenceOpakovani.idOpakSekvence, opak.idSekvenceOpakovani.sekvence 的类型与com.vo.OpakOdeslaniVO 的构造函数提供的类型相同。

    作为调试点,您可以只选择这些字段以确保返回数据吗?

    【讨论】:

    • 我意识到,类型匹配:OpakOdeslaniVO(int pocetPokusu, long opakSekvence, String sekvence)。但是当我转到 SQL 时,查询没有返回数据。那么为什么JPA在查询没有返回行的时候调用构造函数呢?
    • opak.idSekvenceOpakovani.idOpakSekvence - opak 没有行,idSekvenceOpakovani 返回的表有两行。但是我假设如果主表没有数据,则无法匹配明细表,可以吗?这是一种奇怪的行为,因为 1)一旦有人在明细表中插入一行,它就开始失败 2)它在另一个环境中运行良好,主表和明细表中都有行。源代码两年不变。
    • 好像有人在插入数据的时候搞砸了?
    • 我可能会错误地解释表关系。让我们简化一下:表A(id_sequence int, sequence_definition varchar),表B(counter int, id_sequence int),其中B.id_sequence是A的外键。A表有行,B没有行,所以加入SQL查询将不返回任何内容。但是等效的 JQL 会引发构造函数错误:select new VO(b.counter, b.sequence.sequenceId, b.sequence.sequenceDefinition) from BEntity b。感谢您的任何提示
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多