Как отобразить свойство только для использования HQL (в Hibernate)? - PullRequest
5 голосов
/ 11 мая 2010

У меня есть такая таблица:

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.

Обновление:

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

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

Но в нашем реальном мире существует ошибка с лет , которая, кажется, никого не волнует. Так у кого-нибудь есть предложения для обхода?

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

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

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

Обновление: Просто чтобы уточнить, со следующей сущностью:

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 голосов
/ 18 февраля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...