[JAVA] Ordnen Sie POJO nur bestimmte Spalten zu, indem Sie mit dem Repository suchen

Überblick

Es gab eine Möglichkeit, mit dem Repository von Spring Data JPA nur die erforderlichen Spalten in der Suche abzurufen. Ich habe den Code geschrieben und ausprobiert. Früher habe ich es in JPQL geschrieben wie "SELECT new com.example.domain.Fuga (...) FROM Hoge AS hoge ...", aber jetzt ist es viel einfacher zu implementieren. ..

Umgebung

Referenz

Beispielcode

Entitätsklasse

package com.example.domain.entity;

import com.example.domain.StandardType;
import lombok.*;

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

@Entity
@Table(name="item")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = {"itemStocks"})
@EqualsAndHashCode(exclude = {"itemStocks"})
public class Item implements Serializable {

    private static final long serialVersionUID = -3153084093423004609L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="name", nullable = false)
    private String name;
    @Column(name="price", nullable = false)
    private Integer price;
    @Column(name="sales_from", nullable = false)
    private LocalDateTime salesFrom;
    @Column(name="sales_to", nullable = false)
    private LocalDateTime salesTo;
    @Enumerated(EnumType.ORDINAL)
    @Column(name="standard_type", nullable = false)
    private StandardType standardType;
    @JoinColumn(name = "category_id", nullable = false)
    @ManyToOne
    private Category category;
    @Column(name="del_flag", nullable = false)
    private Boolean delFlag;
    @Column(name="create_at", nullable = false)
    private LocalDateTime createAt;
    @Column(name="update_at", nullable = false)
    private LocalDateTime updateAt;

    @OneToMany(mappedBy = "item", cascade = CascadeType.ALL)
    private List<ItemStock> itemStocks;
}

Dto Klasse

Eine Dto-Klasse, die nur ID, Name und Preis der Item-Entitäten enthält. Ordnet die Ergebnisse der Repository-Suche dieser Klasse zu.

package com.example.domain.dto;

import lombok.Value;

@Value
public class ItemNameAndPrice {
    private Long id;
    private String name;
    private Integer price;
}

Repository-Klasse

package com.example.domain.repository;

import com.example.domain.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> {
    // Class-Suchmethode für basierte Projektionen
    <T> T findOneById(Long id, Class<T> type);
}

Suche mit findOne

Item item = repository.findOne(1L);

SQL ausgegeben

select
    item0_.id as id1_1_0_,
    item0_.category_id as categor10_1_0_,
    item0_.create_at as create_a2_1_0_,
    item0_.del_flag as del_flag3_1_0_,
    item0_.name as name4_1_0_,
    item0_.price as price5_1_0_,
    item0_.sales_from as sales_fr6_1_0_,
    item0_.sales_to as sales_to7_1_0_,
    item0_.standard_type as standard8_1_0_,
    item0_.update_at as update_a9_1_0_,
    category1_.id as id1_0_1_,
    category1_.create_at as create_a2_0_1_,
    category1_.del_flag as del_flag3_0_1_,
    category1_.name as name4_0_1_,
    category1_.update_at as update_a5_0_1_ 
from
    item item0_ 
inner join
    category category1_ 
       on item0_.category_id=category1_.id 
where
    item0_.id=?

Class-based projections

ItemNameAndPrice nameAndPrice = repository.findOneById(1L, ItemNameAndPrice.class);

Es ist intern noch neu für Dto.

select new com.example.domain.dto.ItemNameAndPrice(
    generatedAlias0.id,
    generatedAlias0.name,
    generatedAlias0.price) 
from
    Item as generatedAlias0 
where
    generatedAlias0.id=:param0

SQL ausgegeben

select
    item0_.id as col_0_0_,
    item0_.name as col_1_0_,
    item0_.price as col_2_0_ 
from
    item item0_ 
where
    item0_.id=?

Recommended Posts

Ordnen Sie POJO nur bestimmte Spalten zu, indem Sie mit dem Repository suchen
[Java] Fügen Sie Anführungszeichen nur zu bestimmten CSV-Spalten hinzu