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.