Получение атрибутов внешнего ключа в DTO - PullRequest
0 голосов
/ 18 июня 2020

Я использую java + Spring framework + Hibernate для создания rest api, но я наткнулся на получение деталей таблицы с использованием атрибутов внешнего ключа. У меня есть следующие таблицы:

https://i.stack.imgur.com/lG7UR.png

Я получаю все рейтинги, указанные с использованием идентификатора продукта, а затем сопоставляю его с DTO, теперь я также хочу заполнить имя пользователя, использующее idusers, поскольку это мой внешний ключ.

То же самое происходит, когда я пытаюсь получить рейтинги, данные пользователями, вместо отображения idproducts Я хочу отображать название продукта и описание продукта, поскольку это внешний ключ.

Любые советы о том, как это сделать с помощью DTO.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы можете использовать ModelMapper при преобразовании DTO в bean-компонент Entity и обратно из Entity-bean-компонента в DTO.

Добавьте ModelMapper в свой проект

<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.5</version>
</dependency>

Определите bean-компонент ModelMapper в вашем Конфигурация Spring

@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}

Предполагается, что следующие модели основаны на данной ER-диаграмме, которую вы предоставили

public class UserDto {
Integer userId;
String role;
String username;
String password;
boolean enabled;
...default and parameterized constructor
...getter and setter methods
}


public class ProductDto {
Integer productId;
String imageUrl;
String category;
int productPrice;
int productQuantity;
String productName;
String productDesc;
...default and parameterized constructor
...getter and setter methods
}


public class RatingDto {
@Id
Integer id;
int rating;
String review;
String ratingscol;
ProductDto productDto;
UserDto userDto;
...default and parameterized constructor
...getter and setter methods
}

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

 @Repository
 public interface RatingRepository extends JpaRepository<Rating, Integer>{
 List<Rating> findByProduct_ProductId(Integer productId);
 }

Затем сопоставьте объекты рейтинга с DTO

 RatingDto ratingDto = modelMapper.map(rating, RatingDto.class);

Теперь вы можете получить имя пользователя следующим образом:

 ratingsDto.getUserDto().getUserName()

Таким же образом вы можете получить оценки по userId и доступ к сведениям о продукте

0 голосов
/ 19 июня 2020

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

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

Предполагая, что у вас есть модель сущности вот так

@Entity
public class User {
    @Id
    Integer id;
    String role;
    String username;
    String password;
    boolean enabled;
}

@Entity
public class Product {
    @Id
    Integer id;
    String imageUrl;
    String category;
    int productPrice;
    int productQuantity;
    String productName;
    String productDesc;
    @OneToMany(mappedBy = "product")
    Set<Rating> ratings;
}

@Entity
public class Rating {
    @Id
    Integer id;
    int rating;
    String review;
    String ratingscol;
    @ManyToOne(fetch = LAZY)
    Product product;
    @ManyToOne(fetch = LAZY)
    User user;
}

Отображение DTO для вашей модели может выглядеть так же просто, как следующее

@EntityView(Rating.class)
interface RatingDto {
    Integer getId();
    UserDto getUser();
    ProductDto getProduct();
}
@EntityView(User.class)
interface UserDto {
    Integer getId();
    String getUsername();
}
@EntityView(Rating.class)
interface ProductDto {
    Integer getId();
    String getProductName();
    String getProductDesc();
}

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

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

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

Он будет получать только те сопоставления, которые вы ему указали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...