java 如何使用定义为接口列表的字段来水合spring数据neo4j实体?

yeotifhr  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(123)

如果我的Entity有一个字段,它是接口类型的集合,我如何告诉spring数据根据正确的具体类型来水合集合中的每个项目?有没有什么方法可以让spring示例化一个Song类的自定义Map,例如,如果有一些从neo4j返回的数据,唯一地将记录标识为Song类(Song类实现MusicItem)?我下面的musicItems集合应该有多个条目,所有条目都有具体的MusicItem类型。
实体

public class Dater implements CSVFormat{

    @Id
    private String userId;

    @Relationship(type = "LISTENS_TO")
    private Set<MusicItem> musicItems = new HashSet<>();

约会者听过的音乐的MusicItem界面

public interface MusicItem{

    String getName();
    MusicItemType getType();

}

从db返回的MusicItem的示例实现

public class Song implements MusicItem{
    @Id
    @GeneratedValue
    private Long id;

}

存储库查询

public interface DaterRepository extends Neo4jRepository<Dater,String>{

    @Query("MATCH (user:Dater { userId: $userId })-[:LISTENS_TO]->(musicItems)<-[mr:LISTENS_TO]-(matches:Dater) "
            + "where id(user) <> id(matches) "
            + "RETURN matches, collect(mr), collect(musicItems) ")
    List<Dater> getMatches(String userId);

db中的示例数据

{
  "identity": 2912,
  "labels": [
    "MusicItem",
    "Song"
  ],
  "properties": {
"name": "Youth",
"isrc": "QM6P41904468",
"smallImageUrl": "https://is4-ssl.mzstatic.com/image/thumb/Music123/v4/3e/29/f8/3e29f87e-239e-d85d-f30e-b93689e863ec/194491036614.jpg/75x75bb.jpg",
"mediumImageUrl": "https://is4-ssl.mzstatic.com/image/thumb/Music123/v4/3e/29/f8/3e29f87e-239e-d85d-f30e-b93689e863ec/194491036614.jpg/320x320bb.jpg",
"largeImageUrl": "https://is4-ssl.mzstatic.com/image/thumb/Music123/v4/3e/29/f8/3e29f87e-239e-d85d-f30e-b93689e863ec/194491036614.jpg/640x640bb.jpg"
  }
}
yyyllmsg

yyyllmsg1#

如果我理解正确的话,我对Java版本数据做了类似的事情,其中我们有不同类型的子增量。一位同事向我展示了如何创建一个抽象的Delta类,其他几个类扩展了这个类。重写的toString方法应该给予子类的类型。https://github.com/JMHReif/sdn-jdk-versions/blob/gerrits-playground/src/main/java/com/jmhreif/sdnjdkversions/domain/Delta.java

相关问题