現在、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 を使用しています。