【发布时间】:2021-10-29 03:46:57
【问题描述】:
我需要为每个子类型映射不同的多态投影。我找到了这个thread 并试图复制它,但它不起作用。类型变量设置正确,但未使用投影子类。我找不到关于这个主题的任何新闻,关于这个的最后一篇文章已经有 5 年历史了。
这是我的基类材料
public class Material implements FileOwner {
protected Long id;
String name;
int grade;
boolean favorite = false;
}
子类链接材料
public class LinkMaterial extends Material {
String url;
}
现在我的预测:
@Projection(name = "material", types = Material.class)
public interface DTOMaterial {
@Value("#{target.getClass().getSimpleName()}")
String getType();
Long getId();
String getName();
int getGrade();
boolean getFavorite();
}
以及继承投影
@Projection(name = "material", types = LinkMaterial.class)
public interface DTOLinkMaterial extends DTOMaterial{
String getURL();
}
这是我获取 DTO 的存储库方法:
@Query(value = "SELECT m from Material m JOIN FETCH m.submissionTasks stm WHERE stm.id.submissionTaskId=:id")
<T> List<T> getForSubmissionTask(Long id, Class<T> type);
我使用这样的方法:
public List<DTOMaterial> getMaterialDTOsForSubmissionTask(Long id) {
return materialRepository.getForSubmissionTask(id, DTOMaterial.class);
}
如果我检查我的 DTOMaterial instanceof DTOLinkMaterial 是否总是错误的。但是,Hibernate 明确理解材料本身是 LinkMaterial,正如您在我在客户端上获得的 json 中看到的那样。
{name: "test LinkMaterial", id: 62, type: "LinkMaterial", grade: 8, favorite: false}
所以类型是正确的。我尝试更改投影的名称,但也没有成功。
希望有人能帮助我,在此先感谢!
【问题讨论】:
标签: java spring postgresql hibernate projection