Приветствую!
Столкнулся с проблемой выполнения hql- запроса к дочерней сущности в двунаправленной ассоциации —
////////////////// GbCapacityEntity class //////////////////
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_CAPACITY")
public class GbCapacityEntity {
@Id
@Column(name = "ORG_ID")
private Integer orgId;
...
@OneToMany(cascade = CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="gbCapacityEntity")
private List<GbLoadForecast> gbLoadForecast;
/**
*
* @return
*/
public List<GbLoadForecast> getGbLoadForecast() {
return gbLoadForecast;
}
/**
*
* @param gbLoadForecast
*/
public void setGbLoadForecast(List<GbLoadForecast> gbLoadForecast) {
this.gbLoadForecast = gbLoadForecast;
}
////////////////// GbLoadForecast class //////////////////
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_LOAD_FORECAST")
public class GbLoadForecast {
@Id
@Column(name = "ORG_ID")
private Integer orgId;
...
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
private GbCapacityEntity gbCapacityEntity;
/**
* @return
*/
public GbCapacityEntity getGbCapacityEntity() {
return gbCapacityEntity;
}
/**
* @param gbLoadForecast
*/
public void setGbCapacityEntity(GbCapacityEntity gbCapacityEntity) {
this.gbCapacityEntity = gbCapacityEntity;
}
...
Соответственно, запрос такой —
////////////////// Some query //////////////////
...
String hql = "FROM com.intellex.marksist.hbn.model.GbLoadForecast E " +
"WHERE E.orgId = :id1 AND E.cargoGroup = :id2";
Session session = HibernateUtil.getMarksistSessionFactory().openSession();
session.beginTransaction();
Query query = session.createQuery(hql);
query.setParameter("id1", orgId);
query.setParameter("id2", gcId);
List results = query.list();
session.close();
...
На query.list(); вылетает —
[java] 4085 ["http-apr-8080"-exec-10] ERROR org.hibernate.util.JDBCExceptionReporter — ORA-00904: "GBLOADFORE0_"."GBCAPACITYENTITY_ORG_ID": ???????????? ?????????????
Кто- нибудь знает, с чем это может быть связано? Был бы весьма признателен за информацию. : -)
Здравствуйте, tavr, Вы писали:
T>Здравствуйте, Аноним, Вы писали:
А>>Столкнулся с проблемой выполнения hql- запроса к дочерней сущности в двунаправленной ассоциации -
А>>На query.list(); вылетает -
А>> 4085 ["http-apr-8080"-exec-10] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-00904: "GBLOADFORE0_"."GBCAPACITYENTITY_ORG_ID": ???????????? ?????????????
А>>Кто- нибудь знает, с чем это может быть связано? Был бы весьма признателен за информацию. : -)
T>попробуйте дописать ассоциации @JoinColumn с именем колонки
Приветствую, tavr!
Дописал, теперь это выглядит так -
[java]
////////////////// GbLoadForecast class //////////////////
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_LOAD_FORECAST")
public class GbLoadForecast {
@Id
@Column(name = "ORG_ID")
private Integer orgId;
...
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "ORG_ID")
private GbCapacityEntity gbCapacityEntity;
/**
* @return
*/
public GbCapacityEntity getGbCapacityEntity() {
return gbCapacityEntity;
}
/**
* @param gbLoadForecast
*/
public void setGbCapacityEntity(GbCapacityEntity gbCapacityEntity) {
this.gbCapacityEntity = gbCapacityEntity;
}
...
Другое исключение — Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.intellex.marksist.hbn.model.GbLoadForecast column: ORG_ID (should be mapped with insert="false" update="false")
Дело в том, как я подозреваю, что в связке есть одноименные поля- колонка с именем ORG_ID есть как в таблице MARKSIST.GB_LOAD_FORECAST, так и в таблице MARKSIST.GB_CAPACITY. Есть- ли какой- нибудь "обходной маневр", назовем его так?

Или дело не в этом?
Здравствуйте, ivanov-void, Вы писали:
Возьми текст запроса получающегося в результате и попробуй его выполнить в какой-нибудь тулзе SQL Developer/PLSQL Developer/TOAD. Сразу и увидишь проблему. Может где-то используется ключевое слово в названии какой-нибудь колонки...
To avoid ORA-00904, column names cannot be a reserved word, and must contain these four criteria to be valid:
* begin with a letter
* be less than or equal to thirty characters
* consist only of alphanumeric and the special characters ($_#); other characters need double quotation marks around them
Здравствуйте, Antei, Вы писали:
A>Возьми текст запроса получающегося в результате и попробуй его выполнить в какой-нибудь тулзе SQL Developer/PLSQL Developer/TOAD. Сразу и увидишь проблему. Может где-то используется ключевое слово в названии какой-нибудь колонки...
A>To avoid ORA-00904, column names cannot be a reserved word, and must contain these four criteria to be valid:
A> * begin with a letter
A> * be less than or equal to thirty characters
A> * consist only of alphanumeric and the special characters ($_#); other characters need double quotation marks around them
Да, все верно.
В дочерней сущности замапил связь через JoinTable —
...
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinTable(name="MARKSIST.GB_CAPACITY",joinColumns={@JoinColumn(name="ORG_ID")})
private GbCapacityEntity gbCapacityEntity;
...
Запрос —
...
String hql = "FROM com.intellex.marksist.hbn.model.GbLoadForecast G " +
"WHERE G.orgId = :id1 AND G.cargoGroup = :id2";
...
Принял вид —
...
[java] Hibernate:
[java] select
[java] gbloadfore0_.ORG_ID as ORG1_4_,
[java] gbloadfore0_.GRUP_GRUZ as GRUP2_4_,
[java] gbloadfore0_.CHANGER_ID as CHANGER3_4_,
[java] gbloadfore0_.FST_2012 as FST4_4_,
[java] gbloadfore0_.FST_2013 as FST5_4_,
[java] gbloadfore0_.FST_2014 as FST6_4_,
[java] gbloadfore0_.FST_2015 as FST7_4_,
[java] gbloadfore0_.RW_ID as RW8_4_,
[java] gbloadfore0_.SENDER_ID as SENDER9_4_,
[java] gbloadfore0_.ST_ID as ST10_4_,
[java] gbloadfore0_1_.gbCapacityEntity_ORG_ID as gbCapac10_3_
[java] from
[java] MARKSIST.GB_LOAD_FORECAST gbloadfore0_,
[java] MARKSIST.GB_CAPACITY gbloadfore0_1_
[java] where
[java] gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+)
[java] and gbloadfore0_.ORG_ID=?
[java] and gbloadfore0_.GRUP_GRUZ=?
...
Исключение —
[java] 3634 ["http-apr-8080"-exec-7] ERROR org.hibernate.util.JDBCExceptionReporter — ORA-00904: "GBLOADFORE0_1_"."GBCAPACITYENTITY_ORG_ID": ???????????? ?????????????
Прогнал запрос в PL/ SQL Dev —
select
gbloadfore0_.ORG_ID as ORG1_4_,
gbloadfore0_.GRUP_GRUZ as GRUP2_4_,
gbloadfore0_.CHANGER_ID as CHANGER3_4_,
gbloadfore0_.FST_2012 as FST4_4_,
gbloadfore0_.FST_2013 as FST5_4_,
gbloadfore0_.FST_2014 as FST6_4_,
gbloadfore0_.FST_2015 as FST7_4_,
gbloadfore0_.RW_ID as RW8_4_,
gbloadfore0_.SENDER_ID as SENDER9_4_,
gbloadfore0_.ST_ID as ST10_4_,
gbloadfore0_1_.gbCapacityEntity_ORG_ID as gbCapac10_3_
from
MARKSIST.GB_LOAD_FORECAST gbloadfore0_,
MARKSIST.GB_CAPACITY gbloadfore0_1_
where
gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+) and
gbloadfore0_.ORG_ID=310961 and
gbloadfore0_.GRUP_GRUZ=13
В селекте вместо
ORG_ID какое- то странное вхождение —
gbCapacityEntity_ORG_ID, В предикате where обращение корректное —
gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+)
Поэтому, собственно, такое исключение. Однако вопрос- почему в запросе, сгенерированном Hibernate, фигурирует неизвестное и не существующее поле?
Здравствуйте, ivanov-void, Вы писали:
IV>Здравствуйте, Antei, Вы писали:
A>>Возьми текст запроса получающегося в результате и попробуй его выполнить в какой-нибудь тулзе SQL Developer/PLSQL Developer/TOAD. Сразу и увидишь проблему. Может где-то используется ключевое слово в названии какой-нибудь колонки...
A>>To avoid ORA-00904, column names cannot be a reserved word, and must contain these four criteria to be valid:
A>> * begin with a letter
A>> * be less than or equal to thirty characters
A>> * consist only of alphanumeric and the special characters ($_#); other characters need double quotation marks around them
IV>Да, все верно.
IV>В дочерней сущности замапил связь через JoinTable -
IV>IV>...
IV> @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
IV> @JoinTable(name="MARKSIST.GB_CAPACITY",joinColumns={@JoinColumn(name="ORG_ID")})
IV> private GbCapacityEntity gbCapacityEntity;
IV>...
IV>
IV>Запрос -
IV>IV>...
IV> String hql = "FROM com.intellex.marksist.hbn.model.GbLoadForecast G " +
IV> "WHERE G.orgId = :id1 AND G.cargoGroup = :id2";
IV>...
IV>
IV>Принял вид -
IV>IV>...
IV> [java] Hibernate:
IV> [java] select
IV> [java] gbloadfore0_.ORG_ID as ORG1_4_,
IV> [java] gbloadfore0_.GRUP_GRUZ as GRUP2_4_,
IV> [java] gbloadfore0_.CHANGER_ID as CHANGER3_4_,
IV> [java] gbloadfore0_.FST_2012 as FST4_4_,
IV> [java] gbloadfore0_.FST_2013 as FST5_4_,
IV> [java] gbloadfore0_.FST_2014 as FST6_4_,
IV> [java] gbloadfore0_.FST_2015 as FST7_4_,
IV> [java] gbloadfore0_.RW_ID as RW8_4_,
IV> [java] gbloadfore0_.SENDER_ID as SENDER9_4_,
IV> [java] gbloadfore0_.ST_ID as ST10_4_,
IV> [java] gbloadfore0_1_.gbCapacityEntity_ORG_ID as gbCapac10_3_
IV> [java] from
IV> [java] MARKSIST.GB_LOAD_FORECAST gbloadfore0_,
IV> [java] MARKSIST.GB_CAPACITY gbloadfore0_1_
IV> [java] where
IV> [java] gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+)
IV> [java] and gbloadfore0_.ORG_ID=?
IV> [java] and gbloadfore0_.GRUP_GRUZ=?
IV>...
IV>
IV>Исключение -
IV>[java] 3634 ["http-apr-8080"-exec-7] ERROR org.hibernate.util.JDBCExceptionReporter — ORA-00904: "GBLOADFORE0_1_"."GBCAPACITYENTITY_ORG_ID": ???????????? ?????????????
IV>Прогнал запрос в PL/ SQL Dev -
IV>IV>select
IV> gbloadfore0_.ORG_ID as ORG1_4_,
IV> gbloadfore0_.GRUP_GRUZ as GRUP2_4_,
IV> gbloadfore0_.CHANGER_ID as CHANGER3_4_,
IV> gbloadfore0_.FST_2012 as FST4_4_,
IV> gbloadfore0_.FST_2013 as FST5_4_,
IV> gbloadfore0_.FST_2014 as FST6_4_,
IV> gbloadfore0_.FST_2015 as FST7_4_,
IV> gbloadfore0_.RW_ID as RW8_4_,
IV> gbloadfore0_.SENDER_ID as SENDER9_4_,
IV> gbloadfore0_.ST_ID as ST10_4_,
IV> gbloadfore0_1_.gbCapacityEntity_ORG_ID as gbCapac10_3_
IV>from
IV> MARKSIST.GB_LOAD_FORECAST gbloadfore0_,
IV> MARKSIST.GB_CAPACITY gbloadfore0_1_
IV>where
IV> gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+) and
IV> gbloadfore0_.ORG_ID=310961 and
IV> gbloadfore0_.GRUP_GRUZ=13
IV>
IV>В селекте вместо ORG_ID какое- то странное вхождение — gbCapacityEntity_ORG_ID, В предикате where обращение корректное — gbloadfore0_.ORG_ID=gbloadfore0_1_.ORG_ID(+)
IV>Поэтому, собственно, такое исключение. Однако вопрос- почему в запросе, сгенерированном Hibernate, фигурирует неизвестное и не существующее поле?
вы не указали Hibernate имя колонки для ссылки на родителя, поэтому он сгенерил это имя используя имя локальной переменной
Здравствуйте, tavr, Вы писали:
T>вы не указали Hibernate имя колонки для ссылки на родителя, поэтому он сгенерил это имя используя имя локальной переменной
..спасибо!