MapStruct 3实体1 DTO

保罗·马塞林·贝扬(Paul Marcelin Bejan):

我需要一个具有5个列,DSC,语音,startDate,endDate,标志的DTO。

来自NatureEntity的desc,来自VoiceEntity的声音,来自QwertyEntity的其他三个

我不知道如何在同一JSON中检索此信息。

自然实体

@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;

}

语音实体

@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;

}

映射器:

来自NatureEntity的desc来自VoiceEntity的语音startDate,endDate和来自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
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
public interface AbcService {

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

}

服务实施

@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控制器

@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);
    }

}
admlz635:

您可以将其他“实体”对象添加为映射方法的参数,例如

@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排除未映射的属性

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章