Критерии гибернации для неотображаемого свойства - PullRequest
4 голосов
/ 26 марта 2012

У меня есть древовидный объект, управляемый Hibernate. У объекта есть список дочерних элементов, и у каждого дочернего элемента есть свой custom_order в пределах родительского элемента:

<hibernate-mapping>
  <class name="MyClass" .../>
  <property .../>
  <property .../>
  <list name="children" cascade="save-update" inverse="false">
    <key column="parent_id"/>
    <index column="custom_order"/>
    <one-to-many class="MyClass"/>
  </list>
</hibernate-mapping>

Здесь custom_order существует для того, чтобы поддерживать порядок дочерних элементов в родительском элементе, но не имеет представления в Java POJO и управляется непосредственно Hibernate. Единственное, что мне нужно сделать, это предоставить список, и custom_order будет сгенерирован автоматически. Пока все хорошо.

То, чего я хочу добиться, - это возможность использовать Criteria API и заказывать по custom_order. На данный момент я просто не могу сделать ничего подобного

criteria.addOrder(Order.asc("custom_order"));

потому что такого свойства POJO нет.

Вопрос: есть ли способ использовать Criteria API для этого сценария без добавления POJO getter / setter?

РЕДАКТИРОВАТЬ: Я не против добавить соответствующий атрибут custom_order в MyClass, но я просто не думаю, что это возможно в Hibernate.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2012

Можно сопоставить атрибут custom_order с MyClass без добавления метода получения или установки для этого атрибута.Просто настройте атрибут custom_order для доступа по полю.

Кроме того, чтобы разработчики не могли изменять свойство custom_order с помощью отражения, сделайте custom_order доступным только для чтения, задав для insert и update значение false:

<property name="customerOrder" column="custom_order" access="field" insert="false" update="false"/>

В настоящее время Order в Criteria API может обрабатывать только сопоставленные свойства.Если вы не хотите отображать атрибут custom_order в MyClass, вы можете достичь своей цели, если Order в Criteria API поддерживает сортировку по нативному SQL.Есть несколько запросов на эту поддержку ( HHH-1356 , HHH-2381 , HHH-3315) , но они до сих пор не решены.

К счастью, кто-то уже расширил класс Order для поддержки упорядочения с помощью собственного SQL .Так что, если вы не отобразите столбец custom_order для MyClass, вы можете просто использовать этот расширенный класс Order:

addOrder(new NativeSQLOrder("custom_order" ,true))
0 голосов
/ 02 апреля 2012

Вы можете добавить свойства во время выполнения к вашему отображению гибернации, а затем использовать их в Criteria. В infoq есть хорошая статья о том, как динамически добавлять и добавлять настраиваемые поля.

0 голосов
/ 26 марта 2012

Вы не можете включить несопоставленное свойство в запрос критерия.Hibernate будет выдавать исключение свойства nu-mapped, когда вы выполняете attribute.list () или crit.uniqueResult ().

...