#java
Вопрос:
Прежде всего, это больше из любопытства, и единственной пользой для этого будет более чистый код.
У меня есть сущность, представляющая одну из моих таблиц БД. На нем у меня есть один @NamedQuery
и один @NamedNativeQuery
(С соответствующим @SqlResultSetMapping
для первого).
Это работает. В этом нет ничего плохого. «Проблема» в том, насколько перегруженной она кажется.
@Entity @Table(name = "objects") @NamedNativeQuery(name = "MyObject.getObjectPreview", query = "SELECT " " o.attr AS attr1, a.attr AS attr2, b.attr AS attr3 " "FROM objects o " " LEFT JOIN related1 a ON a.id = o.id_related1 " " LEFT JOIN related2 b ON b.id = o.id_related2 " "WHERE o.id_objeto = ?1", resultSetMapping = "Mapping.MyObjectPreview") @SqlResultSetMapping(name = "Mapping.MyObjectPreview", classes = @ConstructorResult(targetClass = ObjectPreview.class, columns = {@ColumnResult(name = "attr1"), @ColumnResult(name = "attr2"), @ColumnResult(name = "attr3")})) public class MyObject implements Serializable { /*Attributes, getters, setters and such*/ }
Итак, чтобы сделать это немного более «читабельным», я начал с того, что поместил свой запрос в другой класс и получил к нему доступ с помощью статического метода. Следующий шаг, и в чем заключается вопрос, заключается в том, чтобы сделать то же самое, но с classes
@SqlResultSetMapping
аннотацией.
В идеале я бы хотел, чтобы это как можно больше выходило за рамки. В этом примере я использую аннотации для отдельных запросов и сопоставления, но целью было бы вывести их все наружу. Так что это будет из (только пример)
@Entity @Table(name = "objects") @NamedNativeQuery(name = "MyObject.getObjectPreview", query = NamedQueries.GET_OBJECT_PREVIEW, resultSetMapping = "Mapping.MyObjectPreview") @SqlResultSetMapping(name = "Mapping.MyObjectPreview", classes = QueryingConstuctors.OBJECT_PREVIEW) public class MyObject implements Serializable { /*Attributes, getters, setters and such*/ }
Для
@Entity @Table(name = "objects") @NamedNativeQueries(value = NativeQueries.OBJECT_ENTITY) @SqlResultSetMappings(value = QueryingConstructors.OBJECT_MAPPINGS) public class MyObject implements Serializable { /*Attributes, getters, setters and such*/ }
Опять же, я ожидаю меньше беспорядка только ближе к началу этого занятия. Я также знаю, что подобная функциональность может быть достигнута с помощью выражений конструктора, но они недоступны в версии JPA, с которой мне нужно работать.
Основные проблемы, с которыми я сталкиваюсь, очевидно, связаны с «возвратом» интерфейса без реализации, поэтому я не могу просто return @SqlResultSetMapping( /*args*/ );
. Другой вариант, который я попробовал, — это агрегировать аннотации, но это привело либо к «свойство не найдено» для моего запроса, либо к «недопустимому запросу», если я исключил @NamednativeQueries
. Моя окончательная идея состоит в том, чтобы создать абстрактный класс , поместить туда все мои аннотации и по-прежнему аннотировать MyObject @Entity
, но это более деликатный шаг, поскольку этот класс является одним из самых важных классов в этой системе, и я стараюсь быть как можно более ненавязчивым.
Достижимо ли это вообще?
Спасибо!
Комментарии:
1. Конфигурация Xml поддержки Spring. Поэтому вместо того, чтобы настраивать конфигурацию в качестве аннотаций, вы можете создать совершенно отдельный Xml-файл, который выполняет ту же работу.
2. Вот в чем дело orm.xml файл, верно? У нашего проекта его нет (те, кто его запустил, остановились на всех конфигурациях Java). Я предполагаю, что добавление одного даже так поздно не должно быть проблемой, но я хотел бы придерживаться Java для согласованности. Я попробую, но не знаю, оставлю ли я это. Спасибо!