Проекция на основе интерфейса - я хочу выбрать только несколько столбцов из Product и ProductImages Таблицы БД.
Проблема: Если я упоминаю отображенную модель в интерфейсе public Set<ProductImagesDBResult> getProductImages();
, она выбирает все столбцы. из таблиц Product и ProductImages.
Примечание: Если я закомментирую это, он выберет только выбранные поля.
Модели сущностей Product. java
@Entity
@Table(name = "products")
@EntityListeners(AuditingEntityListener.class)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name = "product_id")
private Set<ProductImage> productImages;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
private String sku;
private String slug;
private String title;
private String description;
private BigDecimal oldPrice;
private BigDecimal newPrice;
private int status;
/* getters and setters */
}
Модель объекта ProductImage. java
@Entity
@Table(name = "product_images")
public class ProductImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@JoinColumn(name = "product_id")
@ManyToOne
@JsonIgnore
private Product product;
private String image;
private int isDefault;
private int imgOrder;
}
ProductDetailsDBResult. java (интерфейс проекции)
public interface ProductDetailsDBResult {
public long getId();
public String getSlug();
public String getTitle();
public Set<ProductImagesDBResult> getProductImages();
interface ProductImagesDBResult {
public long getId();
public String getImage();
}
/* getters and setters */
}
ProductRepository. java
public interface ProductRepository extends JpaRepository<Product, Long> {
Optional<ProductDetailsDBResult> findBySlug(String slug);
}
ProductService. java
ProductDetailsDBResult p = productRepository.findBySlug(slug)
.orElseThrow(() -> new RecordNotFoundException("Invalid product slug " + slug));
Проблема:
Когда эта строка закомментирована:
public interface ProductDetailsDBResult {
/* other get methods ... */
// public Set<ProductImagesDBResult> getProductImages();
}
Журналы показывают (корректно SQL, поскольку выбираются только упомянутые столбцы):
Hibernate: select product0_.id as col_0_0_, product0_.slug as col_1_0_, product0_.title as col_2_0_ from products product0_ where product0_.slug=?
Но когда эта строка не закомментирована: public Set<ProductImagesDBResult> getProductImages();
SQL извлекает все поля из таблиц Product, Category и ProductImages: (продукт сопоставлен с моделями Category и ProductImages)
Hibernate: select product0_.id as id1_5_, product0_.category_id as categor11_5_, product0_.created_at as created_2_5_, product0_.description as descript3_5_, product0_.new_price as new_pric4_5_, product0_.old_price as old_pric5_5_, product0_.sku as sku6_5_, product0_.slug as slug7_5_, product0_.status as status8_5_, product0_.title as title9_5_, product0_.updated_at as updated10_5_ from products product0_ where product0_.slug=?
Hibernate: select category0_.id as id1_0_0_, category0_.description as descript2_0_0_, category0_.is_featured as is_featu3_0_0_, category0_.preview_image as preview_4_0_0_, category0_.slug as slug5_0_0_, category0_.title as title6_0_0_ from categories category0_ where category0_.id=?
Hibernate: select productima0_.product_id as product_5_4_0_, productima0_.id as id1_4_0_, productima0_.id as id1_4_1_, productima0_.image as image2_4_1_, productima0_.img_order as img_orde3_4_1_, productima0_.is_default as is_defau4_4_1_, productima0_.product_id as product_5_4_1_ from product_images productima0_ where productima0_.product_id=?
Как я могу получить только упомянутые столбцы из обеих таблиц?
Буду признателен за любую помощь. Заранее спасибо! :)