Как использовать подвыбор HQL в условиях фильтра Hibernate? - PullRequest
5 голосов
/ 25 июля 2011

Я хочу использовать фильтры Hibernate, чтобы фильтровать объекты «MyEntity», используя выбор «AnotherEntity» в условии фильтра.Конфигурация выглядит примерно так:

<hibernate-mapping>

  <filter-def name="myFilter" condition="someProperty in (select x.property1 from AnotherEntity x where property2 = :property2)">
    <filter-param name="property2" type="long"/>
  </filter-def>

  <class name="com.example.MyEntity" table="SOME_TABLE">
    <id name="OID" column="O_ID" type="long">
      <generator class="hilo">
        <param name="table">oid_id</param>
        <param name="column">next_id</param>
      </generator>
    </id>
    <version name="hibernateVersion" column="hibernate_version" unsaved-value="negative"/>
    <property name="someProperty"/>
    <filter name="myFilter"/>
  </class>

  <class name="com.example.AnotherEntity" table="ANOTHER_TABLE">
    <composite-id>
      <key-many-to-one name="property1" ... />
      <key-many-to-one name="property2" ... />
    </composite-id>
  </class>

</hibernate-mapping>

, что дает мне org.hibernate.exception.SQLGrammarException: could not execute query соответственно SQLException Table "ANOTHERENTITY" not found, поскольку сгенерированный оператор SQL содержит «AnotherEntity» вместо сопоставленной таблицы «ANOTHER_TABLE», как если быкартографирование не найдено.Однако, когда я просто выполняю подпункт

select x.property1 from AnotherEntity x where property2 = :property2

, он просто отлично работает.

Что мне здесь не хватает?Мой конфиг неверен?Можно ли использовать Suselect HQL в фильтрах?

1 Ответ

4 голосов
/ 24 июня 2013

Как оказалось, условия фильтрации не поддерживают HQL во всей его красе. Вы должны использовать SQL или, точнее, написать фрагмент предложения WHERE. Это означает, что вы должны использовать имена таблиц и столбцов, а не имена сущностей и свойств.

Однако вы можете использовать именованные заполнители просто отлично. Придерживаясь примера в вопросе, вы напишите свое состояние следующим образом:

<filter-def name="myFilter" condition="SOME_COLUMN in (select x.COLUMN_X from ANOTHER_TABLE x where COLUMN_Y = :foo)">
    <filter-param name="foo" type="long"/>
  </filter-def>

Похоже, что это условие прикреплено к запросу после того, как HQL переведен в SQL, но до замены заполнителя. По крайней мере для версии 3.x Hibernate.

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