Уменьшение параметров аннотации

#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 для согласованности. Я попробую, но не знаю, оставлю ли я это. Спасибо!