Java JPA Spring存储库日期筛选返回空数组
在两个日期之间调用查询将返回一个空数组,但它不应该返回 我正在使用这个“简单”的spring存储库:Java JPA Spring存储库日期筛选返回空数组,java,spring,hibernate,spring-data,spring-data-jpa,Java,Spring,Hibernate,Spring Data,Spring Data Jpa,在两个日期之间调用查询将返回一个空数组,但它不应该返回 我正在使用这个“简单”的spring存储库: import java.time.LocalDate; import java.util.List; import org.springframework.data.repository.CrudRepository; import com.company.app.domain.DailySales; public interface DailySalesRepo extends CrudRe
import java.time.LocalDate;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import com.company.app.domain.DailySales;
public interface DailySalesRepo extends CrudRepository<DailySales, Long> {
public List<DailySales> findByDateBetween(LocalDate start, LocalDate end);
}
将该跟踪复制到SQL控制台将返回101项:
select dailysales0_.id as id1_0_, dailysales0_.amount as amount2_0_, dailysales0_.currency as currency3_0_, dailysales0_.date as date4_0_, dailysales0_.tenantId as tenantId5_0_ from agg_dailysells dailysales0_ where dailysales0_.date between "2016-02-01" and "2016-05-12";
结果:返回101行
但是List result
得到一个空列表
我做错了什么
我的实体看起来像:
@Entity
@Table(name="agg_dailysells")
public class DailySales implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer tenantId;
private LocalDate date;
private Double amount;
private Integer currency;
... getters and setters go here ...
据我所知,Hibernate4不支持Java8时间API。您应该使用
java.util.Date
而不是任何java8时间抽象,或者升级到Hibernate5,并将Hibernate-java8
模块添加到依赖项中。有关JavaLocalDate
和Hibernate 4的更多信息,您可以看到这一点。Hibernate 4不支持Java 8 LocalDate或LocalDateTime API。原因是Hibernate4和JPA2.1是在Java8之前发布的\
幸运的是,JPA2.1支持将实体属性转换为数据库列表示,反之亦然。您可以使用此界面在日期和本地日期之间进行转换
您必须重写两个方法,一个用于实体属性到数据库列,另一个用于数据库列到属性
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
看看这个博客。哪个版本的hibernate和Spring数据?我使用的是org.hibernate:hibernate entitymanager:4.2.0.Final和org.springframework.Data:Spring数据jpa:1.9.4。RELEASE@BlackBishop如果仍然相关,请看我的答案。
@Entity
@Table(name="agg_dailysells")
public class DailySales implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer tenantId;
private LocalDate date;
private Double amount;
private Integer currency;
... getters and setters go here ...
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
@Entity
@Table(name="agg_dailysells")
public class DailySales implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer tenantId;
@Column
@Convert(converter = LocalDateAttributeConverter.class)
private LocalDate date;
private Double amount;
private Integer currency;