我正在审查这样的JPQL查询:

SELECT   SELECT   SUM(  func('NVL', l.prim_emiti_ced_periodo, 0)
    + func('NVL', l.prim_dev_n_emiti_ced_fin, 0)
    - func('NVL', l.prim_dev_n_emiti_ced_ini, 0))
    primas_cedidas_netas,
    SUM(  func('NVL', l.com_prim_emiti_ced_periodo, 0)
    + func('NVL', l.com_prim_dev_n_emiti_ced_fin, 0)
    - func('NVL', l.com_prim_dev_n_emiti_ced_ini, 0))
    gastos_reintegrados,
    SUM (func('NVL', l.reaj_com_segun_siniestralidad, 0))
    reajustes_gastos_reintegrados,
    SUM (func('NVL', l.prest_gastos_pagados_ced, 0)) siniestros_pagados,
    SUM (func('NVL', l.recobros_cedidos, 0)) siniestros_recobrados,
    SUM (func('NVL', l.deposito_sobre_prim_fin, 0)) deposito_retenido_a_X,
    SUM (func('NVL', l.deposito_sobre_prim_ini, 0)) deposito_reembolsado,
    SUM(func('NVL', l.prim_dev_n_emiti_ced_fin, 0)
    + func('NVL', l.prim_emiti_ced_pend_cob_fin, 0))
    primas_pend_cobro_a_X,
    SUM (func('NVL', l.detrac_sobre_deposito_prim_fin, 0))
    detraccion_depo_retenido,
    SUM(func('NVL', l.com_prim_dev_n_emiti_ced_fin, 0)
    + func('NVL', l.com_prim_emit_ce_pedte_cob_fin, 0))
    gasto_reinteg_s_pp,
    SUM(func('NVL', l.prim_dev_n_emiti_ced_ini, 0)
    + func('NVL', l.prim_emiti_ced_pend_cob_ini, 0))
    primas_pdte_cobro_cta_anterior,
    SUM (func('NVL', l.detrac_sobre_deposito_prim_ini, 0))
    detraccion_depo_ret_s_ppc_ant,
    SUM(func('NVL', l.com_prim_dev_n_emiti_ced_ini, 0)
    + func('NVL', l.com_prim_emit_ce_pedte_cob_ini, 0))
    gasto_reinteg_s_pp_cta_anterior,
    SUM (func('NVL', l.intereses_deposito, 0)) intereses_s_depo_reemb,
    SUM (func('NVL', l.participacion_beneficios, 0)) participacion_beneficios,
    SUM (func('NVL', l.participacion_perdidas, 0)) participacion_perdidas,
    AVG(cc.porcentaje_participacion) porcentaje_participacion,
    AVG(c.porcCesGralIni) porcCesGralIni,
    SUM (func('NVL', l.saldo_cuenta_efec_cp, 0) + func('NVL', l.depos_sobre_siniest_pdtes_fin, 0) -  func('NVL', l.depos_sobre_siniest_pdtes_ini, 0) ) saldo_cuenta_efec_cp,
    SUM (func('NVL', l.depos_sobre_siniest_pdtes_fin, 0) ) deposito_retenido_a_X_sin,
    SUM (func('NVL', l.depos_sobre_siniest_pdtes_ini, 0) ) deposito_reembolsado_sin

        FROM   LiquidacionCpReaseg l, ContratoComun c, ContratoCorredor cc
        WHERE   l.id.pais = c.pais.id
        AND l.id.compania = c.compania.id
        AND l.id.tipo_contrato = c.tipoContrato.id
        AND l.id.producto = c.producto
        AND l.id.reasegurador = c.reasegurador.id
        AND l.id.anio_suscripcion = c.anyo
        AND c.id = cc.id.id_contrato
        AND l.id.trimestre=:trimestre
        AND l.id.anio_suscripcion=:anio
        AND l.producto.id.tipoProducto IN:tiposProducto
        AND l.id.pais IN :paises
        AND l.id.compania = :compania
        AND l.corredor.id = cc.corredor.id
        AND l.id.reasegurador=:id AND l.corredor.id=:identificadorCorredor


问题是,如果我记录生成的查询,则它在FROMWHERE投影中有所不同:

FROM   Corredor t9,
         Corredor t8,
         PRODUCTO t7,
         Reasegurador t6,
         TIPO_CONTRATO t5,
         COMPANIA t4,
         PAIS t3,
         CONTRATO_COMUN t2,
         CONTRATO_CORREDOR t1,
         LIQUIDACIONES_CP_REASEG t0
 WHERE   ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (t0.pais = t3.id_pais)
                                      AND (t0.compania = t4.id_compania))
                                    AND (t0.tipo_contrato =
                                            t5.id_tipo_contrato))
                                  AND (t0.producto = t2.producto))
                                AND (t0.reasegurador = t6.id_reasegurador))
                              AND (t0.anio_suscripcion = t2.anyo))
                            AND (t2.id_contrato = t1.id_contrato))
                          AND (t0.trimestre = 201506))
                        AND (t0.anio_suscripcion = 1991))
                      AND (t7.tipo_producto IN (1)))
                    AND (t0.pais IN (116)))
                  AND (t0.compania = 1))
                AND (t8.id_corredor = t9.id_corredor))
              AND (t0.reasegurador = 1))
            AND (t0.corredor = 0))
          AND ( ( ( ( ( ( (t3.id_pais = t2.pais)
                         AND (t4.id_compania = t2.compania))
                       AND (t5.id_tipo_contrato = t2.tipo_contrato))
                     AND (t6.id_reasegurador = t2.reasegurador))
                   AND ( (t7.tipo_producto = t0.producto)
                        AND ( (t7.compania = t0.compania)
                             AND (t7.pais = t0.pais))))
                 AND (t8.id_corredor = t0.corredor))
               AND (t9.id_corredor = t1.id_corredor)))


项目正在使用EclipseLink 2.2.0Oracle11数据库。使用SpringRoo生成实体

查询是这样生成的:

TypedQuery<Object[]> q =entityManager.createQuery(jpql+sFiltroCorredorResasegurador,Object[].class);
...
return q.getSingleResult();`

最佳答案

编辑答案

在您选择的部分中,我什么都没有看到,这会导致访问ManyToOne参考。
您还尝试了懒惰地获取这些引用,这些引用没有任何改变。
因此,剩下的就是Where部分。当我较早回答您时,这就是我所忽略的。

例如,表PAIS被添加到where SQL中,因为在JPQL中有一个Where项l.id.pais = c.pais.id
我敢打赌,ContratoComun中有一个ManyToOne参考派。
c.pais.id将解析为:加载c.pais引用的PAIS实体,然后使用的属性ID为
加载的实体,以选择应引用哪个“ ContratoComun”。这只是一个非常复杂的示例的一部分
但我认为其他参考资料可以用相同的方式解释。

旧的过时的答案

如果你的意思是,“为什么在from子句中有更多的表,然后在jpa from子句中有更多的类”,那么,(不知道类的定义)我会猜想你使用例如manyToOne引用了其他类,例如“ PRODUCTO”。

我不知道您的完整选择部分。但是我认为实体管理器出于某种原因试图从引用的对象中添加字段。添加了其他条款以匹配ManyToOne对象的外键。

09-26 16:56