java - MapStruct 3 实体 1 DTO
问题描述
我需要一个包含 5 个列、desc、voice、startDate、endDate、flag 的 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;
}
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
@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;
}
}
休息控制器
@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);
}
}
解决方案
您可以将其他“实体”对象添加为映射方法的参数,例如
@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
排除未映射的属性
推荐阅读
- python - 如何在文本文件中附加打印的脚本?
- php - htaccess 问题。一条规则有效,另一条无效
- html - Jquery 'click' 功能仅适用于“if”语句,不适用于“else if”
- linux - Linux NetEm-测量的数据包损坏方式太低
- javascript - Highcharts 树状图
- javascript - 生成器返回在 for-await-of 循环中不起作用
- php - 如何获取 next_post() 链接以使用手动排序而不是 Wordpress 中的默认页面 ID 排序?
- typescript - 如何使用 Typescript 对可能的空数组进行建模
- python - 捆绑提取具有地牢的每个链接将它们分开并将每个链接添加到列表中并删除重复项
- rest-assured-jsonpath - Jayway JSONPath 元素检索