我试图通过这种方式加入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;
}