【问题标题】:JPA Spring repository dates filtering returning empty arrayJPA Spring存储库日期过滤返回空数组
【发布时间】:2016-04-07 08:35:32
【问题描述】:

在两个日期之间调用查询会返回一个空数组,但它不应该。

我正在使用这个“简单”的 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 行

但是List&lt;DailySales&gt; 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 ...

【问题讨论】:

  • hibernate 和 Spring Data 哪个版本?
  • 我正在使用 org.hibernate:hibernate-entitymanager:4.2.0.Final 和 org.springframework.data:spring-data-jpa:1.9.4.RELEASE
  • @BlackBishop 如果它仍然相关,请查看我的答案。

标签: java spring hibernate spring-data spring-data-jpa


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    您必须覆盖两种方法,一种用于实体属性到数据库列,另一种用于数据库列到属性。

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 2021-09-03
      • 2017-08-06
      • 1970-01-01
      • 2017-04-23
      • 2018-11-09
      • 2022-10-13
      • 2017-10-20
      相关资源
      最近更新 更多