Преобразование @Entity в интерфейс проекции вручную - PullRequest
0 голосов
/ 30 апреля 2020

Так что я большую часть времени пользуюсь Spring Data Repositories. Но я достиг варианта использования, где я не могу использовать свой репозиторий Spring для извлечения сущности, которую мне нужно вернуть клиенту. Итак, у меня есть мой класс ResourceEntity, который является объектом данных Spring. И я хотел бы вернуть эту сущность как ResourceProjection интерфейс.

@Getter
@Setter
@NoArgsConstructor
@Entity
public class ResourceEntity{
    private Long id;
    private String name;
    private String anotherFieldThatIsNotInTheProjection;
}

public interface ResourceProjection {
    Long getId();
    String getName();
}

Обычно с помощью репозитория Spring я бы определил что-то вроде этого:

public interface ResourceRepository extends PagingAndSortingRepository<ResourceEntity, Long> {
    Optional<ResourceProjection> getById(Long id);
}

В этом В этом случае я не могу использовать «automati c proxy», сгенерированный Spring Data, для автоматической реализации моей проекции с данными объекта.

Итак, мой вопрос: есть ли способ «вручную» преобразовать сущность в проекцию?

Еще одно решение, о котором я подумал, - вернуть сущность и использовать аннотации Джексона, такие как @JsonIgnore, для предотвращения некоторые из моих данных должны быть возвращены, но это не является оптимальным способом написания моего кода.

В противном случае я всегда могу создать класс DTO, который будет заполняться данными из сущности. Но так как я уже создал свою проекцию для других целей, я бы хотел избежать создания второго "DTO".

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете сделать проекцию программно следующим образом:

import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;

 //... 
  resourceEntity = //find resource
  ProjectionFactory pf = new SpelAwareProxyProjectionFactory();
  ResourceProjection rp = pf.createProjection(ResourceProjection.class, resourceEntity)
0 голосов
/ 02 мая 2020

Это идеальный вариант использования для Blaze-Persistence Entity Views .

Я создал библиотеку, которая позволяет легко сопоставлять модели JPA и модели, определяемые пользовательским интерфейсом, что-то вроде Spring Data Projection. на стероидах. Идея состоит в том, что вы определяете целевую структуру так, как вам нравится, и сопоставляете атрибуты (получатели) посредством выражений JPQL с моделью сущностей. Поскольку имя атрибута используется в качестве сопоставления по умолчанию, вам, в основном, не нужны явные сопоставления, поскольку в 80% случаев используется DTO, которые являются подмножеством модели сущностей.

Сопоставление для вашей модели может Выглядите так просто, как показано ниже:

@EntityView(ResourceEntity.class)
interface ResourceProjection {
  @IdMapping
  Long getId();
  String getName();
}

Запрос - это применение представления сущности к запросу, самым простым из которых является запрос по идентификатору.

ResourceProjection dto = entityViewManager.find(entityManager, ResourceProjection.class, id);

Но интеграция Spring Data позволяет использовать его почти так же, как Spring Data Projection: https://persistence.blazebit.com/documentation/1.4/entity-view/manual/en_US/#spring -data-features

...