JPQL:无法加入实体 - ORA-00904:无效的标识符

时间:2018-04-19 07:45:32

标签: hibernate jpa spring-data-jpa jpql

我试图通过这种方式加入entites:

Query query =em.createQuery("select m from com.ric.bill.model.mt.Meter m "
    + "join com.ric.bill.model.mt.MeterLog g with m.meterLog.id=g.id "
    + "join com.ric.bill.model.ar.Kart k with k.id=g.kart.id");

但是我得到了下一个例外:

    ... 62 common frames omitted
19-04-2018 13:19:49.906 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 904, SQLState: 42000
19-04-2018 13:19:49.906 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-00904: "KART3_"."LSK": invalid identifier

这是休眠日志的控制台输出:

19-04-2018 13:19:49.894 [main] DEBUG o.h.internal.util.EntityPrinter - com.ric.bill.model.ar.House{dw=<uninitialized>, ko=com.ric.bill.model.oralv.Ko#1513, mlog=<uninitialized>, nd=59, street=com.ric.bill.model.ar.Street#5, klskId=1513, id=187, houseSite=<uninitialized>, kw=<uninitialized>, tarifklsk=<uninitialized>}
19-04-2018 13:19:49.894 [main] DEBUG o.h.internal.util.EntityPrinter - com.ric.bill.model.tr.Serv{servOdn=com.ric.bill.model.tr.Serv#82, servPrice=null, servVrt=null, klskId=734188, dw=<uninitialized>, servSt=com.ric.bill.model.tr.Serv#80, servDep=null, id=79, inclPrsn=true, servUpst=com.ric.bill.model.tr.Serv#80, cd=Электроснабжение, inclAbsn=false, ko=com.ric.bill.model.oralv.Ko#734188, servMet=com.ric.bill.model.tr.Serv#79, checkOrg=true, servWokpr=null, servOrg=com.ric.bill.model.tr.Serv#79, npp=160, servChrg=com.ric.bill.model.tr.Serv#79, servRound=null, npp2=5, servStKeep=com.ric.bill.model.tr.Serv#79, name=Электроснабжение, vrt=null, servTree=<uninitialized>}
19-04-2018 13:19:49.895 [main] DEBUG org.hibernate.SQL - 
    select
        meter0_.ID as ID1_44_,
        meter0_.FK_K_LSK as FK_K_LSK2_44_,
        meter0_.FK_METER_LOG as FK_METER_LOG4_44_,
        meter0_.TRANS_RATIO as TRANS_RATIO3_44_ 
    from
        MT.METER meter0_ 
    inner join
        MT.METER_LOG meterlog1_ 
            on (
                meter0_.FK_METER_LOG=meterlog1_.ID
            )
    inner join
        AR.KART kart2_ 
            on (
                kart2_.lsk=kart3_.lsk
            )
19-04-2018 13:19:49.905 [main] DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not extract ResultSet [n/a]
19-04-2018 13:19:49.906 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-00904: "KART3_"."LSK": invalid identifier

Query query =em.createQuery("select m from com.ric.bill.model.mt.Meter m "
        + "join com.ric.bill.model.mt.MeterLog g with m.meterLog.id=g.id "
        + "join g.kart k with k.id=g.kart.id");

为什么hibernate引用不存在&#34; kart3 _&#34;别名?

如果我将我的实体视为相关,我的查询效果很好:

Query query =em.createQuery("select m from com.ric.bill.model.mt.Meter m "
    + "join com.ric.bill.model.mt.MeterLog g with m.meterLog.id=g.id "
    + "join g.kart k with k.id=g.kart.id");

输出:

19-04-2018 13:30:51.829 [main] TRACE o.h.t.descriptor.sql.BasicExtractor - extracted value ([FK_K_LSK2_44_] : [INTEGER]) - [832736]
19-04-2018 13:30:51.829 [main] TRACE o.h.t.descriptor.sql.BasicExtractor - extracted value ([FK_K_LSK2_44_] : [INTEGER]) - [832736]
19-04-2018 13:30:51.829 [main] TRACE o.h.t.descriptor.sql.BasicExtractor - 

对于我目前的任务,我需要将这些实体视为不相关,并且不能这样做。为什么?

UPD-1

我也尝试用&#34;来改变#34; &#34; on&#34;但没有成功:

Query query =em.createQuery("select m from com.ric.bill.model.mt.Meter m "
    + "join com.ric.bill.model.mt.MeterLog g on m.meterLog.id=g.id "
    + "join com.ric.bill.model.ar.Kart k on k.id=g.kart.id");

ORA-00904: "KART3_"."LSK": invalid identifier

我用:

<spring-framework.version>5.0.5.RELEASE</spring-framework.version>
<hibernate.version>5.1.0.Final</hibernate.version>

实体:

仪表

@Entity
@Table(name = "METER", schema="MT")
@Getter @Setter
public class Meter extends Base implements java.io.Serializable, Storable {

    public Meter (){

    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", updatable = false, nullable = false)
    protected Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_METER_LOG", referencedColumnName="ID")
    private MeterLog meterLog ; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name="FK_METER", referencedColumnName="ID")
    @BatchSize(size = 50)
    private List<Vol> vol = new ArrayList<Vol>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_METER", referencedColumnName="ID")
    @BatchSize(size = 50)
    private List<MeterExs> exs = new ArrayList<MeterExs>(0);

    @Column(name = "TRANS_RATIO", updatable = true, nullable = true)
    private Double trRatio; 
}

MeterLog

@Entity
@Table(name = "METER_LOG", schema="MT")
@Getter @Setter
public class MeterLog extends Base implements java.io.Serializable, MLogs {

    public MeterLog () {

    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", updatable = false, nullable = false)
    protected Integer id;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_METER_LOG", referencedColumnName="ID")
    @BatchSize(size = 50)
    private List<Meter> meter = new ArrayList<Meter>(0);

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name="FK_METER_LOG", referencedColumnName="ID", updatable = false)
    @Fetch(FetchMode.SUBSELECT) private List<Vol> vol = new ArrayList<Vol>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="NOD_SRC", referencedColumnName="ID")
    @Fetch(FetchMode.SUBSELECT)
    private List<MeterLogGraph> outside = new ArrayList<MeterLogGraph>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="NOD_DST", referencedColumnName="ID")
    @Fetch(FetchMode.SUBSELECT)
    private List<MeterLogGraph> inside = new ArrayList<MeterLogGraph>(0);

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_TP", referencedColumnName="ID")
    private Lst tp; 

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_SERV", referencedColumnName="ID")
    private Serv serv; 

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_KLSK_OBJ", updatable = false, insertable = false)
    private Kart kart; 

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_K_LSK", updatable = false, insertable = false)
    private House house; 

    @Column(name = "FK_KLSK_OBJ", updatable = false, nullable = true)
    private Integer klskObj;

    @Column(name = "ENTRY", updatable = false, nullable = true)
    private Integer entry;


}

赛车

@SuppressWarnings("serial")
@Entity
@Table(name = "KART", schema="AR")
@Getter @Setter
public class Kart implements java.io.Serializable, MeterContains, TarifContains  {

    public Kart() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "lsk", updatable = false, nullable = false)
    private Integer lsk; //id записи


    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_K_LSK", referencedColumnName="FK_KLSK_OBJ")
    @BatchSize(size = 20)
    private List<Dw> dw = new ArrayList<Dw>(0);

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="ID", updatable = false, insertable = false)
    private Ko ko;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KW", referencedColumnName="ID", updatable = false, insertable = false)
    private Kw kw;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_UK", referencedColumnName="ID", updatable = false, insertable = false)
    private Org uk;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_KLSK_OBJ")
    @BatchSize(size = 50)
    private List<MeterLog> mlog = new ArrayList<MeterLog>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_KLSK_OBJ")
    @BatchSize(size = 50)
    private List<TarifKlsk> tarifklsk = new ArrayList<TarifKlsk>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_KLSK_OBJ")
    @Fetch(FetchMode.SUBSELECT)
    private List<Reg> reg = new ArrayList<Reg>(0);

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="FK_KLSK_OBJ", referencedColumnName="FK_KLSK_OBJ")
    @Fetch(FetchMode.SUBSELECT)
    private List<RegState> regState = new ArrayList<RegState>(0);

    @Column(name = "FK_KW", nullable = true)
    private Integer fkKw;

    @Column(name = "FLSK", nullable = true, updatable = false, insertable = false)
    private String flsk;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name="LSK", referencedColumnName="LSK", updatable = false)
    @Fetch(FetchMode.SUBSELECT)
    @Filters({
        @Filter(name = "FILTER_CHRG1")})
    private List<Chrg> chrg = new ArrayList<Chrg>(0);

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name="LSK", referencedColumnName="LSK", updatable = false)
    @Fetch(FetchMode.SUBSELECT)
    private List<PrivilegeChrg> privilegeChrg = new ArrayList<PrivilegeChrg>(0);
    @Column(name = "DT1", updatable = false, nullable = true)
    private Date dt1;

    @Column(name = "DT2", updatable = false, nullable = true)
    private Date dt2;


}

0 个答案:

没有答案