[英]MapStruct 3 Entity 1 DTO
I need a DTO with 5 colums, desc, voice, startDate, endDate, flag.我需要一个包含 5 个列、desc、voice、startDate、endDate、flag 的 DTO。
desc from NatureEntity, voice from VoiceEntity, the other three from QwertyEntity来自 NatureEntity 的 desc,来自 VoiceEntity 的声音,其他三个来自 QwertyEntity
I don't know how to retrive this information in the same JSON.我不知道如何在同一个 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 Qwerty实体
@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 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来自 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存储库
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 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 *
unmappedTargetPolicy = ReportingPolicy.IGNORE
排除未映射的属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.