Вы не можете делать бизнес-логику с MapStruct. Так что держите отображения простыми и определяйте свои собственные методы, когда дело доходит до условных отображений в списке. Примечание: вы можете написать свой собственный метод, и MapStruct выберет его. Кроме того, из этой собственной реализации вы можете снова обратиться к методам MapStruct.
public abstract class TargetOrderMapper {
@Autowired
private StatusRepository statusRepository;
@Mappings({
@Mapping(target = "id", source = "reference"),
@Mapping(target = "preferedItem", source = ""), // Here I need to loop through these values checking for a single value with a specific tag
@Mapping(target = "items", source = "items"), // List of objects to another list of different data types.
@Mapping(target = "status", source = "remoteStatus") // may need to extract a value from a repository
})
abstract OrderDto toTargetOrderDto(RemoteOrder remoteOrder);
protected List<Item> toItemList(List<Item> items) {
// do what ever you want..
// and call toItem during iterating.
}
protected abstract Item toItem(Item item);
}
То же самое относится и к состоянию. Я добавил FAQ FAQ некоторое время назад о списке (в основном об обновлении, но я думаю, что то же самое применимо и здесь).
О поисках, вы можете использовать @MappingContext
для передачи контекстакоторый содержит логику для доступа к БД. Смотри здесь