使用 eclipselink 和 @namedquery 进行错误转换
Posted
技术标签:
【中文标题】使用 eclipselink 和 @namedquery 进行错误转换【英文标题】:error casting with eclipselink and @namedquery 【发布时间】:2014-05-12 19:28:25 【问题描述】:一段时间以来,我在eclipselink映射中遇到了问题。
我有两个类,Acordo 和 ValorAcordo。
所以我有
@ Entity
@ Table ( name = " TB_ACORDO " , schema = " JUR " )
@ NamedQueries (
@ NamedQuery ( name = " sql1 "
query = " SELECT a.NU_ACORDO , a.NU_MOVIMENTACAO , v.NU_CONTRATO "
+ "FROM Acordo"
+ " INNER JOIN ValorAcordo v"
+ "ON a.NU_ACORDO = v.NU_ACORDO "
+ " WHERE = a.NU_MOVIMENTACAO : nu_movimentacao " )
)
public class Acordo implements Serializable
private static final long serialVersionUID = - 6202293050832719017L ;
@ Id
@ GeneratedValue ( strategy = GenerationType.IDENTITY )
private Long NU_ACORDO ;
private Long NU_MOVIMENTACAO ;
private Long VR_TOTAL ;
@ OneToOne ( fetch = FetchType.LAZY )
private ValorAcordo valorAcordo ;
// ***
和
@ Entity
@ Table ( name = " TB_VALOR_ACORDO " , schema = " JUR " )
public class ValorAcordo implements Serializable
private static final long serialVersionUID = 3024868010888830368L ;
@ Id
@ GeneratedValue ( strategy = GenerationType.IDENTITY )
private Long NU_VALOR_ACORDO ;
private Long NU_ACORDO ;
private Long NU_CONTRATO ;
private Long NU_PARTE ;
private Long QT_PARCELA ;
private Long VR_ACORDO ;
@ Temporal ( TemporalType.TIMESTAMP )
private Date DT_PRIMEIRA_PARCELA ;
@ Temporal ( TemporalType.TIMESTAMP )
private Date DT_ULTIMA_PARCELA ;
@ OneToOne ( fetch = FetchType.LAZY )
private acordo;
// ***
当我跑步时
Query q = em.createNamedQuery ( " sql1 " Acordo.class )
. setParameter ( " nu_movimentacao " 3103461 );
List <Acordo> q.getResultList list = ( ) ;
EclipseLink 返回以下错误:
Exception in thread " main" java.lang.ClassCastException : [ Ljava.lang.Object ; can not be cast to br.victor.des.bean.Acordo
at br.victor.des.main.MainAcordo.main ( MainAcordo.java : 46)
有什么想法吗?
我认为这是一个映射问题,但发现一个链接 eclipsebug 一些开发人员报告了这个错误。但是他们在简单查询时遇到了这个问题,我只有在使用 JOIN 时才会遇到这个问题!
谢谢
【问题讨论】:
【参考方案1】:sql1 的查询定义为“SELECT a.NU_ACORDO , a.NU_MOVIMENTACAO , v.NU_CONTRATO..”- 它从 Acordo 中选择 3 个字段,而不是完整实例,因此 JPA 为您提供对象数组列表包含每行的 3 个值。如果您想要完整的实体,请将查询更改为“SELECT a FROM Acordo a...”。
【讨论】:
我改为“SELECT a, v ...”,因为我需要两个表的值!但eclipselink生成一个奇怪的SQL......他们选择所有列TB_Acordo和TB_ValorAcordo但eclipselink创建de列“ACORDO_NU_ACORDO”! oO那不存在!看一看! “SELECT t0.*, t1.*, t1.ACORDO_NU_ACORDO FROM JUR.TB_ACORDO t0, JUR.TB_VALOR_ACORDO t1 WHERE ((t0.NU_MOVIMENTACAO = ?) AND (t0.NU_ACORDO = t1.NU_ACORDO))”和来自 Oracle 的错误“' T1' 'ACORDO_NU_ACORDO.': 标识符无效" 您的问题有一个来自使用 3 个字段的 classCastException。如果您有其他想要解决的问题,或者其他一些导致您以这种方式设计系统的潜在问题,我们无法读懂您的想法。根据您的实际问题创建一个问题,有人可能会提供帮助。 在这种情况下,您的映射与您似乎在数据库中的映射不匹配。例如,您的查询暗示 ValorAcordo 具有 Acordo 的外键,但 Acordo 中的 1:1 映射默认使用 Acordo 中指向 ValorAcordo 的外键,我认为该外键不存在,并且 ValorAcordo->Acordo 尚未创建错误状态的另一个外键不存在,而不是使用我认为是预期外键的 NU_ACORDO 字段。尝试从一个简单的 JPA 示例开始,然后扩展到您的模型以上是关于使用 eclipselink 和 @namedquery 进行错误转换的主要内容,如果未能解决你的问题,请参考以下文章
EclipseLink 如何使用两个@OneToMany 和@ManyToOne 来替换@ManyToMany
Eclipselink 2.5 使用 Maven 生成元模型
在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常
EclipseLink 原生查询和 FetchType 行为