Доступ к имени схемы в условии фильтра

@Entity
@Table(name = "my_table")
@FilterDef(name = "MyTable.current")
@Filter(name = "MyTable.current", condition = """
    revision_number = (select max(v.revision_number) from {h-schema}my_table as v where id = v.id)
            """)
public class MyRevisioneEntity extends PanacheEntityBase {
  @Id
  /* This is NOT autogenerated */
  UUID id;
  @Id
  @Column(name = "revision_number")
  long revision;
  @Basic(fetch = FetchType.LAZY)
  @Formula("(revision_number = (select max(v.revision_number) from {h-schema}my_table as v where id = v.id))")
  boolean latestRevision;
  // ... metadata, target of revision!
}

Над моим доменом простая сущность, идентифицируемая UUID, может иметь несколько ревизий.
Обычно мне нужна только самая последняя версия, поэтому я решил создать фильтр MyTable.current, но у меня возникла проблема: заполнитель {h-schema} не разрешен, поэтому мне приходится создавать схему в состоянии фильтра.
То же условие, что и @Formula к свойству latestRevision, работает безупречно (заполнитель разрешается, как и ожидалось).

Это задумано или условие @Filter должно разрешать заполнитель, как это делает @Formula?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что {h-schema} здесь поддерживается... Хотя, возможно, так и должно быть; не стесняйтесь создать запрос на функцию: https://hibernate.atlassian.net/browse/HHH

А пока вы можете попробовать просто использовать @SqlFragmentAlias:

@Filter(name = "MyTable.current", condition = """
    revision_number = (select max(v.revision_number) from {mytable} as v where id = v.id)
            """,
    aliases = @SqlFragmentAlias(alias = "mytable", table = "my_table"))
public class MyRevisioneEntity extends PanacheEntityBase {

См. также https://docs.jboss.org/hibernate/orm/6.5/userguide/html_single/Hibernate_User_Guide.html#pc-filter-sql-fragment-alias.

Кстати, вы можете рассмотреть возможность использования Envers вместо внедрения собственного решения.


Обновлено: предложение ниже не работает, см. https://hibernate.atlassian.net/browse/HHH-18152

@Filter(name = "MyTable.current", condition = """
    revision_number = (select max(v.revision_number) from {mytable} as v where id = v.id)
            """,
    aliases = @SqlFragmentAlias(alias = "mytable", entity = MyRevisioneEntity.class))
public class MyRevisioneEntity extends PanacheEntityBase {

См. также https://docs.jboss.org/hibernate/orm/6.5/userguide/html_single/Hibernate_User_Guide.html#pc-filter-sql-fragment-alias (хотя в этом разделе, похоже, не упоминается entity =, так что, возможно, оно устарело).

Использование аннотации объекта приводит к этому исключению во время загрузки фабрики сеанса: org.hibernate.UnknownEntityTypeException: невозможно найти персистент: MyRevisioneEntity в MappingMetamodelImpl.getEntityDescriptor(MappingMetamodelImp‌​l.java:394) в FilterConfiguration.mergeAliasMaps(FilterConfiguration.java:‌​81) в FilterConfiguration.getAliasTableMap(FilterConfiguration.jav‌​a:56) в FilterHelper.<init>(FilterHelper.java:76)

Luca Basso Ricci 22.05.2024 09:01

Хм, цифры. Значит, недокументированный и сломанный. Может @SqlFragmentAlias(alias = "mytable", table = "my_table")?

yrodiere 22.05.2024 12:13

Выдает неверный SQL, поскольку таблица в подзапросе должна быть my_table, а не ее псевдоним в основном запросе. выберите mre1_0.id, mre1_0.revision_number из my_table mre1_0, где номер_версии = (выберите max(v.revision_number) из mre1_0 как v, где id = v.id)

Luca Basso Ricci 22.05.2024 12:57

Что касается проблемы jira: не только ссылка на самого себя не работает, но и ссылка на любые другие объекты, не созданные на этапе начальной загрузки (например, 2 объекта с @filterdef и один объект ссылается на другой)

Luca Basso Ricci 23.05.2024 07:27

Другие вопросы по теме