Это не так сложно, как я предполагал.
Учитывая класс (фрагмент)
@NodeEntity
public class Actor {
@Id @GeneratedValue
private Long id;
@Convert(MyImageListConverter.class)
public List<MyImage> images = new ArrayList<>();
// ....
}
с MyImage
настолько простым, насколько это возможно
public class MyImage {
public String blob;
public MyImage(String blob) {
this.blob = blob;
}
public static MyImage of(String value) {
return new MyImage(value);
}
}
и конвертер
public class MyImageListConverter implements AttributeConverter<List<MyImage>, String[]> {
@Override
public String[] toGraphProperty(List<MyImage> value) {
if (value == null) {
return null;
}
String[] values = new String[(value.size())];
int i = 0;
for (MyImage image : value) {
values[i++] = image.blob;
}
return values;
}
@Override
public List<MyImage> toEntityAttribute(String[] values) {
List<MyImage> images = new ArrayList<>(values.length);
for (String value : values) {
images.add(MyImage.of(value));
}
return images;
}
}
распечатает следующий отладочный вывод при сохранении, которое, я думаю, является тем, что вам нужно:
UNWIND {rows} as row CREATE (n:Actor) SET n=row.props RETURN row.nodeRef as ref, ID(n) as id, {type} as type with params {type=node, rows=[{nodeRef=-1, props={images=[blobb], name=Jeff}}]}
особенно часть изображений.
Метод испытания для этого выглядит как
@Test
public void test() {
Actor jeff = new Actor("Jeff");
String blobValue = "blobb";
jeff.images.add(new MyImage(blobValue));
session.save(jeff);
session.clear();
Actor loadedActor = session.load(Actor.class, jeff.getId());
assertThat(loadedActor.images.get(0).blob).isEqualTo(blobValue);
}