Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > hibernate создает join с lazy таблицй-справочником


Автор: Barvetal 22.10.2006, 02:09
Всем привет!

Есть две таблицы: документ и рубрика. Есть соответствующие два класса.
Мне нужно отобрать документ, принадлежащий рубрике с идентификатором 2.
В приложении мне не нужны никакие поля из таблицы рубрики.
Но sql, который генерит hibernate 3.2, производит join в таблицей рубрики и тянет всю таблицу рубрики на клиента. 

Как можно заставить hibernate не делать этого?

Пример:
Document.hbm.xml:
Код
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.myorg.persistence.pojo">
    <class name="Document" table="DocumentUnited" mutable="false" lazy="true">
        <cache usage="read-only" />
        <id name="unid" type="string" length="32" column="dcm_unid">
            <generator class="assigned" />
        </id>
        <property name="body" column="dcm_body"/>
        <many-to-one name="rubric" column="rbc_id" class="Rubric" lazy="proxy"/>
    </class>
</hibernate-mapping>


Rubric.hbm.xml
Код
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.myorg.persistence.pojo">
    <class name="Rubric" mutable="false" lazy="true" >
        <id name="id" column="rbc_id"/>
        <property name="name" column="rbc_name"/>
    </class>
</hibernate-mapping>


Код, производящий загрузку документа:
Код
Criteria query = session.createCriteria(Document.class);
query.createCriteria("rubric").add(Restrictions.eq("id", 2));
List res = query.list()


Так вот, этот код генерирует следующий запрос:
Код

select -- здесь идет перечень всех полей таблиц документов и рубрик
from DocumentUnited this_ inner join inner join Rubric rubric2_ on this_.rbc_id=rubric2_.rbc_id 
where rubric2_.rbc_id = ?


Но мне не нужны поля таблицы rubric!!! Мне нужны только поля таблицы Document. Зачем hibernate джойнит мне эту таблицу?? Я же ему указал:
Код
<many-to-one name="rubric" column="rbc_id" class="Rubric" lazy="proxy"/>



Я хочу добиться такого запроса:
Код
select // здесь идет перечень всех полей таблиц документов и рубрик
from DocumentUnited this_ 
where this_.rbc_id = ?


Ведь такой запрос меньше нагружает базу и выполняется быстрее. 

Как мне заставить hibernate выполнять запрос таким образом?

Всем заранее спасибо!

Автор: tux 22.10.2006, 08:00
Попробуй выполнить тоже самое запросом на HQL:
Код

Query q = s.createQuery("from Document d where d.rubric.id = :id").setString("id", id);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)