Как получить значение внутри foreach для установки в родительский массив? - PullRequest
0 голосов
/ 21 июня 2020

Как получить значение внутри foreach, чтобы правильно установить его в родительский массив? когда я пытался получить значение, он сказал, что тип возврата недействителен, поэтому его нельзя установить, вот мой код:

Вот мой партнер. java Модель:

@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartner")
public class Partner {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    public String partnerCode;

    public String partnerName;

    @CreatedDate
    private Date createDate;
    @LastModifiedDate
    private Date lastModifiedDate;
    @CreatedBy
    private String createdBy;
    @LastModifiedBy
    private String modifiedBy;

    @OneToMany(mappedBy = "partner", cascade = CascadeType.ALL)
    public List<PartnerShipment> partnerShipment;
    
}

, а затем вот мой PartnerShipment. java:

@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartnerShipment")
public class PartnerShipment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    public String partnerShipmentCode;

    public String partnerShipmentAddress;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "partnerId")
    // @NotAudited
    // @JsonManagedReference
    public Partner partner;

    @CreatedDate
    private Date createDate;
    @LastModifiedDate
    private Date lastModifiedDate;
    @CreatedBy
    private String createdBy;
    @LastModifiedBy
    private String modifiedBy;
    
}

и вот я мой сервис, я хочу обновить две строки моей таблицы partner_shipment:

public Partner edit(InputRequest<Partner> request) {
    Partner partner;
    String currentUser = request.getLoggedInUser();

    Long partnerId = request.getPartner().getId();

    Partner oldPartner = partnerRepository.findById(partnerId).get();
    if (oldPartner != null) {
        partner = request.getPartner();
        partner.setCreateDate(oldPartner.getCreateDate());
        partner.setCreatedBy(oldPartner.getCreatedBy());
        partner.setModifiedBy(currentUser);
        
        partner.getPartnerShipment().forEach(d -> {
            d.setId(oldPartner.getPartnerShipment().forEach(a -> a.getId()));
            d.setPartner(partner);
            d.setCreateDate(oldPartner.getPartnerShipment().get(0).getCreateDate());
            d.setCreatedBy(oldPartner.getCreatedBy());
            d.setModifiedBy(currentUser);
        });

        return partnerRepository.save(partner);
    } else {
        throw new RuntimeException("Employee not found with id : " + partnerId);
    }
    
}

здесь, в этой строке

d.setId(oldPartner.getPartnerShipment().forEach(a -> a.getId()));

вот полная ошибка:

The method setId(Long) in the type PartnerShipment is not applicable for the arguments (void)

как я могу получить старый идентификатор из каждой строки partner_shipment и установить его в partner_shipment, чтобы спящий режим правильно обновить строку на основе нового значения?

1 Ответ

1 голос
/ 21 июня 2020

Хорошо, значит, это не сработает:

 d.setId(oldPartner.getPartnerShipment().forEach(a -> a.getId()));

Причина, по которой это не сработает, в том, что forEach ничего не возвращает. Выражение

 oldPartner.getPartnerShipment().forEach(a -> a.getId())

требует звонить getId() на каждую партнерскую поставку oldPartner и выбросить их все! Таким образом, нет значения для передачи в setId.

Итак, вопрос в том, какой из (многих) идентификаторов отправлений в списке oldPartner отправлений вы хотите установить для d идентификатора. ?

  • Самый маленький? Самый большой? Первый? Последний?

  • соответствующий ? Если да ... как определить, какая отправка в oldPartner соответствует данной отправке в partner?

Если соответствие позиционное (т.е. oldShipments[i] соответствует newShipments[i]) тогда лучше использовать цикл; например, что-то вроде этого:

    List<PartnerShipment> oldShipments = oldPartner.getPartnerShipment();
    List<PartnerShipment> shipments = partner.getPartnerShipment();
    Date shipmentCreateDate = oldShipments.get(0).getCreateDate();

    for (int i = 0; i < oldShipments.size(); i++) :
        PartnerShipment d = shipments.get(i);
        d.setId(oldShipments.get(i).getId());
        d.setPartner(partner);
        d.setCreateDate(shipmentCreateDate);
        d.setCreatedBy(oldPartner.getCreatedBy());
        d.setModifiedBy(currentUser);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...