hql- запрос к дочерней сущности в двунаправленной ассоциаци
От: Аноним  
Дата: 13.03.12 15:35
Оценка:
Приветствую!

Столкнулся с проблемой выполнения 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": ???????????? ?????????????

Кто- нибудь знает, с чем это может быть связано? Был бы весьма признателен за информацию. : -)
Re: hql- запрос к дочерней сущности в двунаправленной ассоци
От: tavr  
Дата: 13.03.12 16:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Столкнулся с проблемой выполнения hql- запроса к дочерней сущности в двунаправленной ассоциации -

А>На query.list(); вылетает -
А>[java] 4085 ["http-apr-8080"-exec-10] ERROR org.hibernate.util.JDBCExceptionReporter — ORA-00904: "GBLOADFORE0_"."GBCAPACITYENTITY_ORG_ID": ???????????? ?????????????
А>Кто- нибудь знает, с чем это может быть связано? Был бы весьма признателен за информацию. : -)

попробуйте дописать ассоциации @JoinColumn с именем колонки
Re[2]: hql- запрос к дочерней сущности в двунаправленной асс
От: ivanov-void  
Дата: 13.03.12 17:06
Оценка:
Здравствуйте, 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. Есть- ли какой- нибудь "обходной маневр", назовем его так? Или дело не в этом?
Re[3]: hql- запрос к дочерней сущности в двунаправленной асс
От: Antei США  
Дата: 13.03.12 19:37
Оценка: +1
Здравствуйте, 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

Re[4]: hql- запрос к дочерней сущности в двунаправленной асс
От: ivanov-void  
Дата: 14.03.12 08:20
Оценка:
Здравствуйте, 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, фигурирует неизвестное и не существующее поле?
Re[5]: hql- запрос к дочерней сущности в двунаправленной асс
От: tavr  
Дата: 14.03.12 08:51
Оценка: +1
Здравствуйте, 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 имя колонки для ссылки на родителя, поэтому он сгенерил это имя используя имя локальной переменной
Re[6]: hql- запрос к дочерней сущности в двунаправленной асс
От: ivanov-void  
Дата: 14.03.12 10:46
Оценка:
Здравствуйте, tavr, Вы писали:

T>вы не указали Hibernate имя колонки для ссылки на родителя, поэтому он сгенерил это имя используя имя локальной переменной


..спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.