1

現在、REST API サービス用に Spring Boot Web 2.2.1 で Spring Data JPA 2.2.1 を使用しています。

/categoriesへの getter 呼び出しは、実際には望ましい結果である次の JSON を返します。

[
    {
        "category1": "A",
        "category2": "B",
        "subcategories": []
    },
    {
        "category1": "A",
        "category2": "B",
        "subcategories": [{
                "field1": "A",
                "field2": "B",
                "field3": "C",
                "field4": "D"
        }]
    },
.........
.........
]

エンティティ:

@Entity
@Table(name = "category")
@Getter @Setter
public class Category {

    @JsonIgnore
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String category1;
    private String category2;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Subcategory> subcategories;
}
@Entity
@Table(name = "subcategory")
@Getter @Setter
public class Subcategory {

    @JsonIgnore
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @JsonIgnore
    private int parent;
    private String field1;
    private String field2;
    private String field3;
    private String field4;
}

コントローラ:

@RestController
public class MyController {

    private final DataService dataService;

    @Autowired
    public MyController(DataService dataService) {
        this.dataService = dataService;
    }

    @GetMapping("/categories")
    public List<Category> getAllCategories() {
        return dataService.getAllCategories();
    }

リポジトリ

public interface MyRepository extends JpaRepository<Category, Long> {
    List<MyRepository> findAll();
}

データサービス

@Component
public class DataService {
    private MyRepository myRepository;

    @Autowired
    public DataService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public List<Category> getAllCategories() { return myRepository.findAll(); }

すべてのフィールドを返すわけではない/limitedCategories API への新しい呼び出しを追加したいと考えています。たとえば、親エンティティの「category2」と、ネストされたエンティティの「field4」は除外されます。

問題:

  • JPA リポジトリ内で目的のフィールドを手動で選択することができず、ネストされたオブジェクトを処理する方法もわかりません。
  • findAll を使用し、@JsonIgnore を使用してそれらのフィールドを除外するという単純なアイデアは、最初のリクエストにはまだそれらのフィールドが必要であるため、不可能です。
  • リポジトリ内で @Query アノテーションを使用して目的のフィールドのみを取得すると、JSON のネストされたフィールドを取得する方法が見つかりません。

前もって感謝します。

Spring Data JPA 2.2.1 と Spring Boot Web 2.2.1 を使用しています。

4

1 に答える 1