JPA で Micronaut Data を使用しており、2 つのエンティティがあります。最初のものはRecipe
次のとおりです。
@Entity
public class Recipe {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToOne
private Category category;
@OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<Step> steps;
// + other fields, getters and setters
}
2番目のものは、次のものParseError
を指しRecipe
ます:
@Entity
@Table(name = "parse_error")
public class ParseError implements Serializable {
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Recipe recipe;
@Id
@Enumerated(EnumType.ORDINAL)
@Column(name = "problem_area")
private ProblemArea problemArea;
private String message;
// + other fields, getters and setters
}
ParseError
ここで、API で DTO にプロパティを提供したいと思いますが、Recipe
エンティティ全体ではなく、ManyToOne と OneToMany の関係が含まれているため、この場合は必要ありません。そこで、そのためにプロジェクション DTO を作成しました。
@Introspected
public class ParseErrorDto {
private Integer recipeId;
private String recipeName;
private ParseError.ProblemArea problemArea;
private String message;
// + getters and setters
}
listAll()
にメソッドを追加しましたParseErrorRepository
:
@Repository
public interface ParseErrorRepository extends CrudRepository<ParseError, Integer> {
List<ParseErrorDto> listAll();
}
しかし、Micronaut Data はネストされたエンティティからプロパティを投影できないか、DTO またはリポジトリ メソッドで何かを見逃しているようです。
ParseErrorRepository.java:22: エラー: リポジトリ メソッドを実装できません: ParseErrorRepository.listAll()。プロパティのレシピ ID がエンティティに存在しません: ParseError
私も作成しようとしましたRecipeDto
:
@Introspected
public class RecipeDto {
private Integer id;
private String name;
// + getters and setters
}
それに応じて更新されましたParseErrorDto
:
@Introspected
public class ParseErrorDto {
private RecipeDto recipe;
private ParseError.ProblemArea problemArea;
private String message;
// + getters and setters
}
再び成功しません:
ParseErrorRepository.java:22: エラー: リポジトリ メソッドを実装できません: ParseErrorRepository.listAll()。タイプ [RecipeDto] のプロパティ [レシピ] は、エンティティで宣言された同等のプロパティと互換性がありません: ParseError
Micronaut Data は、DTO プロジェクションによってこのユース ケースを処理できますか? そうでない場合、Micronaut Data でそれを解決する方法はありますか?