Использование проекции без аннотации @Projection


Ситуация

Я унаследовал некоторый код от разработчика, который, похоже, использовал недокументированные функции spring.

В частности, это связано с использованием функциональности @projection без фактического аннотирования interfaceкак такового.

Конкретный пример таков:

public interface DirType extends KeyValInterface  {
    @Value("#{target.id}") String getId();
    @Value("#{target.code}") String getText();
}
Это не должно работать согласно официальной документации, но это так.
public interface DirTypeRepository extends JpaRepository<ABDirType, Long> {
    List<DirType> findAllSummarizedBy(); 
}

Таким образом, метод findAllSummarizedBy() respository фактически посылает список DirType.

И он использует аннотации @Value для отображения, но без аннотации @Projection.

Класс Entity следующий:

@Data @Entity @Table(name="dir_type") @AllArgsConstructor @NoArgsConstructor
    public static class ABDirType {

        private @Id @GeneratedValue Long id;
        private String code;
    }

Вопрос

Есть ли у кого-нибудь еще информация об этой недокументированной функции, связанной с Projections и не аннотирующей интерфейс как @Projection ?

Возможно ли это во всех версиях или это скрытый хак, который рискованно использовать?

1 2

1 ответ:

В Spring Data JPA (который вы, кажется, используете здесь), вы можете просто использовать интерфейс с соответствующими геттерами в качестве целей проекции.

Смотрите документацию об этом (esp. - Пример 62. Простая Проекция").

Похоже, что нигде в документации нет аннотации @Projection.