2010-05-11 1 views
5

У меня есть таблица вроде этого:Как сопоставить свойство только для использования HQL (в Hibernate)?

id | name | score 

отображенный на POJO с помощью XML с Hibernate. Столбец оценки мне нужен только в oder by - предложениях в HQL. Значение столбца оценки вычисляется по алгоритму и обновляется каждые 24 часа через пакетный процесс SQL (JDBC). Поэтому я не хочу загрязнять свой POJO свойствами, которые мне не нужны во время выполнения.

Для одной колонки, которая может быть не проблема, но у меня есть несколько разных колонок. Есть ли способ отобразить свойство только для использования HQL?

Например, как это:

<property name="score" type="double" ignore="true"/> 

так, что я до сих пор могу это сделать:

from Pojo p order by p.score 

, но моя реализация POJO может выглядеть следующим образом:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

Нет Присваиватель score предоставлено или добавлено к реализации.

с использованием последней версии Hibernate для Java.

Update:

В идеальном мире это может быть сделано, как это (благодаря Pascal Thivent):

<property name="score" access="noop" insert="false" update="false"/> 

Но в нашем реальном мире существует a bug since years, который никто, кажется, заботится о. У кого-нибудь есть предложения об обходном пути?

+0

Об этой штуке нупа, остерегайтесь! Он не будет частью отображаемого Java-объекта, но он все равно будет присутствовать в памяти HQL! Я как-то хотел не получить поле BLOB как часть результата, потому что они заполняли память Java, но это нужно было учитывать в запросе. Я думал, что я в безопасности, но в итоге получаю ошибки OutOfMemory, потому что запрос HQL по-прежнему загружал все BLOB-файлы, даже если они не были частью результатов. – Icegras

ответ

3

Вы можете использовать access="noop" в вашем отображении, чтобы указать на запросе только свойства (это секрет, не документированная особенность см HHH-552):

<property name="score" access="noop" insert="false" update="false" ... /> 

Update: Просто чтобы прояснить, с следующий Entity:

public class EntityWithHqlOnlyProperty implements Serializable { 
    private Long id; 
    private String name; 

    //... 
} 

И это отображение:

<?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> 
    <class name="com.stackoverflow.q2812672.EntityWithHqlOnlyProperty" table="EntityWithHqlOnlyProperty"> 
     <id name="id" type="java.lang.Long"> 
      <column name="id" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" not-null="true" /> 
     </property> 
     <property name="score" type="double" access="noop" insert="false" update="false"/> 
    </class> 
</hibernate-mapping> 

Следующий фрагмент кода:

Query q = session.createQuery("from EntityWithHqlOnlyProperty e order by e.score"); 
List<EntityWithHqlOnlyProperty> resultList = q.list(); 
assertNotNull(resultList); 

генерирует следующий SQL:

select 
    entitywith0_.id as id6_, 
    entitywith0_.name as name6_, 
    entitywith0_.score as score6_ 
from 
    EntityWithHqlOnlyProperty entitywith0_ 
order by 
    entitywith0_.score 

И в моем реальном мире, тест не проходит. Это было протестировано с Hibernate Core 3.3.2.GA на Derby и HSQLDB. Другими словами, он работает на моей машине (с).

Если это не для вас - и я не хочу быть грубым, но - в идеальном мире вы должны предоставить тестовый пример, позволяющий воспроизводить HHH-2925 в соответствии с просьбой в течение 3-х лет. Предоставление способа воспроизведения проблемы (я не мог) сильно увеличивает шансы ее исправления.

+0

Вы уверены, что не отказались от этой функции? Я получаю «org.hibernate.PropertyNotFoundException» – ManBugra

+0

@ManBugra 100% уверен, что он все еще там (я проверил Hibernate 3.2.5.ga, 3.3.2.GA, 3.5.1-Final) и не будет удален. –

+0

с вашим предлагаемым отображением, я получаю PropertyNotFoundException. Мне нужно каким-то образом настроить этот аксессуар? существуют ли другие конфигурации? – ManBugra

-1

Это дает org.hibernate.PropertyNotFoundException, потому что вы, возможно, забыли указать атрибут типа свойства в XML-сопоставлении. Попробуйте попробовать.

Смежные вопросы