2016-04-07 94 views
2

在两个日期之间调用查询将返回一个空数组,但它不应该。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 CrudRepository<DailySales, Long> { 

    public List<DailySales> findByDateBetween(LocalDate start, LocalDate end); 
} 

我调用我的服务范围内的方法:

public class ImplSalesService implements SaleService { 

    private static final long serialVersionUID = 1L; 
    protected final Log logger = LogFactory.getLog(getClass()); 

    @Autowired 
    private DailySalesRepo dailySalesRepo; 

    public List<DailySales> getDailySales(LocalDate start, LocalDate end) { 
     logger.debug("getDailySales with params start/end: " + start.toString() + "/" + end.toString()); 
     List<DailySales> result = dailySalesRepo.findByDateBetween(start, end); 
     return result; 
    } 
} 

我知道Hibernate是获得权利的参数,因为我可以看到日志:

Hibernate: 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 ? and ? 
10:16:03,674 TRACE BasicBinder:83 - binding parameter [1] as [VARBINARY] - 2016-02-01 
10:16:03,682 TRACE BasicBinder:83 - binding parameter [2] as [VARBINARY] - 2016-05-12 

并将该跟踪复制到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行(S)返回

List<DailySales> 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 ... 
+0

哪个版本的hibernate和Spring Data? –

+0

我正在使用org.hibernate:hibernate-entitymanager:4.2.0.Final和org.springframework.data:spring-data-jpa:1.9.4.RELEASE – BlackBishop

+0

@BlackBishop如果它仍然相关看看我的答案。 – mirmdasif

回答

2

据我所知,休眠4不支持Java 8时API。您应该使用java.util.Date而不是任何Java 8时间抽象,或者升级到Hibernate 5,并将hibernate-java8模块添加到您的依赖项中。有关Java LocalDate和Hibernate 4的更多信息,请参见question

0

Hibernate 4不支持Java 8 LocalDate或LocalDateTime API。原因是Hibernate 4和JPA 2.1在Java 8之前发布了。\

幸运的是,Jpa 2.1支持AttributeConverter将实体属性转换为数据库列表示,反之亦然。您可以使用此界面在日期LocalDate之间进行转换。

您必须重写实体属性的两个方法之一到数据库列和另一个数据库列的属性。

@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; 

对此博客post看看。