提问者:小点点

SpringData JPA原生查询提供java. sql数据而不是LocalDate


我有一个原生查询的JPA存储库,如下所示(实际查询很复杂):

@Query(value="select registration_num, registration_date from registration_details", nativeQuery="true")
List<Object[]> getDateDetails();

我把这个列表值放入一个映射中,registration_num作为键,registration_date作为键。

问题是查询是java. sql类型的返回日期,但我需要它在LocalDate类型中。对于要放入map中的每个值,我必须像(Date)obj[1]那样进行转换,然后sqlDate.toLocalDate()才能进一步使用。这是非常低效的。有什么方法可以从查询或返回具有两个属性的类的列表中返回LocalDate,注册Num和注册Date。

例如:

@Query(value="select registration_num, registration_date from registration_details", nativeQuery="true")
List<MyDTO> getDetails(); 

class MyDTO {
  private String registrationNum;
  private LocalDate registrationDate;
}

共1个答案

匿名用户

在最近的Spring版本中,它会自动转换。对于旧版本,您可以使用AtbanteConverter,它会自动应用于实体类中的每个LocalDate类型。

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return (localDate == null ? null : Date.valueOf(localDate));
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
        return (sqlDate == null ? null : sqlDate.toLocalDate());
    }

}