Hibernate JPA:存储库查询中的可选参数出现问题

时间:2018-12-14 09:02:29

标签: hibernate jpa spring-data-jpa

执行以下代码时,我出现此错误:

  

org.hibernate.HibernateException:无法确定其类型   类:java.util.Optional

@Query("Select distinct  new com.myapp.web.rest.dto.AnalyseStockDTO(" +
            "a.lot.id,a.calibre, a.montantHt, l.valorisation, a.nbColis, 0, a.poidsNet, 0," +
            "(s.qteStock * s.lot.emballage.poidsNetStandard), s.qteStock-0, a.nbPieces, s.qteStock, a.prixUnitaire) " +
            "from Annonce a, Stock s, Lot l " +
            "where a.lot.dateArrivee >= :dateDebut and (:dateFin = null or a.lot.dateArrivee<=:dateFin) and a.lot.id not in (select distinct v1.lot.id from Vente v1) " +
            "and a.lot.id = s.lot.id and a.calibre = s.calibre and a.lot.id = l.id " +
            "and s.qteStock>0 ")
List<AnalyseStockDTO> getAnalyseStock(@Param("dateDebut") LocalDate dateDebut, @Param("dateFin") Optional<LocalDate> dateFin);

venteRepository.getAnalyseStock(dateDebut, Optional.ofNullable(dateFin));

你知道为什么吗?

2 个答案:

答案 0 :(得分:1)

Hibernate只是不知道如何处理Optional,只能将简单类型用作查询参数。

在查询级别管理dateFin为空的可能性,您根本不需要使用Optional

List<AnalyseStockDTO> getAnalyseStock(@Param("dateDebut") LocalDate dateDebut, @Param("dateFin") LocalDate dateFin);
venteRepository.getAnalyseStock(dateDebut, dateFin);

答案 1 :(得分:1)

1)Hibernate不支持Optionals这样。只需传递null作为参数,就不要在查询中使用= null进行比较。使用:dateFin IS NULL子句,因为NULL在数据库系统中需要特殊对待。

2)不要使用Optionals作为方法参数-并非为此目的而设计的。 Why should Java 8's Optional not be used in arguments