使用 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 行为

eclipselink.weaving 属性的值和区别是啥?

使用 EclipseLink 处理 Spring 事务