简体   繁体   中英

MapStruct 3 Entity 1 DTO

I need a DTO with 5 colums, desc, voice, startDate, endDate, flag.

desc from NatureEntity, voice from VoiceEntity, the other three from QwertyEntity

I don't know how to retrive this information in the same JSON.

NatureEntity

@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@Entity
@Table(name="NATURE")
public class NatureEntity {

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SEQ_NATURE", unique=true, nullable=false, precision=15)
    private Long seqNature;

    @Column(name="DESC", nullable=false, length=150)
    private String desc;

    @OneToMany(mappedBy="fkNature")
    private List<VoiceEntity> VoiceAssociations;

}

VoiceEntity

@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@Entity
@Table(name="VOICE")
public class VoiceEntity {

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SEQ_VOICE", unique=true, nullable=false, precision=15)
    private Long seqVoice;

    @Column(name="VOICE", nullable=false, length=255)
    private String voice;

    @ManyToOne
    @JoinColumn(name="FK_NATURE", nullable=false)
    private NatureEntity fkNature;

    @OneToMany(mappedBy="fkVoice")
    private List<QwertyEntity> qwertyAssociations;

}

QwertyEntity

@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@Entity
@Table(name="QWERTY")
public class QwertyEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SEQ_QWERTY",unique=true, nullable=false, precision=15)
    private Long seqQwerty;

    @ManyToOne
    @JoinColumn(name="FK_VOICE", nullable=false)
    private VoiceEntity fkVoice;

    @Column(name="FLAG", nullable=true, length=1)
    private String flag;

    @Temporal(TemporalType.DATE)
    @Column(name="START_DATE", nullable=false)
    private Date startDate;

    @Temporal(TemporalType.DATE)
    @Column(name="END_DATE", nullable=false)
    private Date endDate;

}

DTO

@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
public class AbcDTO {

    private String desc;
    private String voice;
    private Date startDate;
    private Date endDate;
    private String flag;

}

Mapper:

desc from NatureEntity voice from VoiceEntity startDate, endDate and flag from QwertyEntity

@Mapper(componentModel = "spring")
public interface AbcMapper {

       @Mapping(source = "desc", target = "desc")
       @Mapping(source = "voice", target = "voice")
       @Mapping(source = "startDate", target = "startDate")
       @Mapping(source = "endDate", target = "endDate")
       @Mapping(source = "flag", target = "flag")
       AbcDTO from(QwertyEntity qwerty);

}

Repository

I have to create a query with three optional parameters.

@Repository
public interface QwertyEntityRepository extends JpaRepository<QwertyEntity, Long> {

    @Query("SELECT q FROM QwertyEntity q WHERE (:desc is null or q.desc = :desc) and (:startDate is null"
            + " or q.startDate = :startDate) and (:endDate is null or q.endDate = :endDate)")
    List <QwertyEntity> findByDescAndStartDateAndEndDate(@Param("desc") String desc, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

}

Service

@Service
public interface AbcService {

    public List<AbcDTO> findByDescAndStartDateAndEndDate(String desc, Date startDate, Date endDate);

}

Service Implementation

@Component
public class AbcServiceImpl implements AbcService {

    @Autowired
    private AbcMapper abcMapper;
    @Autowired
    private QwertyEntityRepository qwertyEntityRepository;

    @Override
    @Transactional
    public List<AbcDTO> findByDescAndStartDateAndEndDate(String desc, Date startDate, Date endDate) {
        List<AbcDTO> dtoList = new ArrayList<>();
        List<QwertyEntity> qwertyList = qwertyEntityRepository.findByDescAndStartDateAndEndDate(desc, startDate, endDate);
        for(QwertyEntity qwerty : qwertyList) {
            dtoList.add(abcMapper.from(qwerty);
        }
        return dtoList;
    }

}

REST Controller

@RestController
@RequestMapping("/services")
public class AbcRestController {

    @Autowired
    private AbcService abcService;

    @GetMapping(value = "/abc", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public List<AbcDTO> getAbc(@PathVariable String desc, @PathVariable Date startDate, @PathVariable Date endDate){
        return abcService.findByDescAndStartDateAndEndDate(desc, endDate, endDate);
    }

}

You can add the other 'entities' objects as parameters of your mapping method, like

@Mapper(componentModel = "spring",
    unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AbcMapper {

    @Mapping(source = "nature.desc", target = "desc")
    @Mapping(source = "voice.voice", target = "voice")
    @Mapping(source = "qwerty.startDate", target = "startDate")
    @Mapping(source = "qwerty.endDate", target = "endDate")
    @Mapping(source = "qwerty.flag", target = "flag")
    AbcDTO from(QwertyEntity qwerty, NatureEntity nature, VoiceEntity voice);

}

* unmappedTargetPolicy = ReportingPolicy.IGNORE it's to exclude unmapped properties

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM