Spring Data JPA выбирает все столбцы, когда включена сопоставленная модель - PullRequest
0 голосов
/ 10 апреля 2020

Проекция на основе интерфейса - я хочу выбрать только несколько столбцов из 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=?

Как я могу получить только упомянутые столбцы из обеих таблиц?

Буду признателен за любую помощь. Заранее спасибо! :)

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