6

我有一个包含 java.time.LocalDateTime 类型属性的类。

public class MyClass{
    // ...
    private LocalDateTime fecha;
    // ...
}

我正在使用 Spring Data 存储库。我想要完成的是根据日期查询实体:

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {
    // ...
    public void deleteByFecha(LocalDate fecha);
    // ...
}

但这不起作用,因为抛出了异常:

org.springframework.dao.InvalidDataAccessApiUsageException:参数值 [2016-10-05] 与预期类型不匹配 [java.time.LocalDateTime (n/a)];

所以问题是如何通过fecha但使用 LocalDate 查询数据库中的 MyClass?

编辑 以防万一有人遇到同样的问题,我想出了一个解决方案:修改存储库的方法,使其如下所示:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
// ...

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {

    @Transactional
    @Modifying
    @Query("DELETE FROM MyClass mtc WHERE YEAR(mtc.fecha)=?1 AND MONTH(mtc.fecha)=?2 AND DAY(mtc.fecha)=?3")
    public void deleteByFecha(Integer year, Integer month, Integer day);

}
4

4 回答 4

9

试试这个(未测试):

public interface IRepository extends CrudRepository<MyClass, UUID> {
    // ...
    default void delByFecha(LocalDate fecha) {

        deleteByFechaBetween(fecha.atStartOfDay(), fecha.plusDays(1).atStartOfDay());

    }

    void deleteByFechaBetween(LocalDateTime from, LocalDateTime to);
    // ...
}
于 2017-05-15T14:02:15.523 回答
2

Zombie Thread,但我想我会把我的解决方案扔进戒指。

我有一个类似的问题,我最终使用了 Hibernate@Formula

例如:

class MyClass {

  private LocalDateTime fecha;

  /* fecha referenced within the annotation should be the column name. 
   * So, if it's different the Java field name (i.e. fecha_dtm or something), 
   * make sure to use it.
  */
  @Formula("CAST(fecha as DATE)") 
  private LocalDate fechaDate;

}

然后你的存储库:

public interface IRepository extends CrudRepository<MyClass, UUID> {
  deleteByFechaDate(LocalDate fecha); // note it's FechaDate, not Fetcha
}

尝试坚持使用符合 ANSI SQL 的函数(符合CASTSQL-92,因此被广泛接受)以在数据库实现之间保持一致。但是,可以使用数据库特定的功能,你只会失去可移植性。

希望这可以帮助你!

于 2019-08-16T14:47:44.923 回答
1

我知道这是一个老问题,但是对于未来,有同样问题的人可以使用这个解决方案:

 default void delByFecha(@RequestParam(name = "date") @DateTimeFormat(iso = ISO.DATE) LocalDate date)

它完美无缺!

于 2018-04-23T18:46:43.230 回答
0

今天我有一个类似的问题(我在做 SELECT,而不是 DELETE),在这里发布之后,我想出了两个解决方案:

@Query(value = "DELETE FROM MyClass mc WHERE DATE(fecha) =:fecha", nativeQuery = true)
public void deleteByFecha(LocalDate fecha);

或者,按照Cepr0回答,我成功地测试了他的解决方案:

default void deleteByFecha(LocalDate fecha) {
    deleteByFechaBetween(fecha.atStartOfDay(), fecha.plusDays(1).atStartOfDay());

}

void deleteByFechaBetween(LocalDateTime from, LocalDateTime to);
于 2020-05-25T08:02:22.317 回答