【问题标题】:jpa query between two dates两个日期之间的jpa查询
【发布时间】:2020-04-17 12:27:39
【问题描述】:

这是我在 SQL Server 上的查询:

select count(*) from noleggi 
where id_utente = 1 AND id_libro =25 and GETDATE() BETWEEN inizio_prestito AND fine_prestito

使用 JPA Repository 的正确语法是什么?

我试过了:

@Query(value = "SELECT COUNT(n) from Noleggio n " +
            "WHERE  n.libroId = ?1 AND n.utenteId=?2 AND CURRENT_DATE() BETWEEN n.inizioPrestito AND n.finePrestito")

    Long countByUtenteIdAndLibroId(Long idLibro, Long idUtente, LocalDate inizioPrestito, LocalDate finePrestito);

并收到此错误:

方法 public abstract java.lang.Long com.finance.biblioteca.repository.NoleggioRepository.countByUtenteIdAndLibroId(java.lang.Long,java.lang.Long,java.time.LocalDate,java.time.本地日期

【问题讨论】:

  • 您尝试的方法无效?
  • 不,它不起作用
  • 您收到错误了吗?没有结果?告诉我们发生了什么。
  • 方法 public abstract java.lang.Long com.finance.biblioteca.repository.NoleggioRepository.countByUtenteIdAndLibroId(java.lang.Long,java.lang.Long,java.time.LocalDate)的查询验证失败,java.time.LocalDate)!

标签: java spring jpa


【解决方案1】:

我对您的问题的看法是您没有BETWEEN 的参数。您只需将字段作为名称而不是 indexed 参数。 您的代码应如下所示:

@Query(value = "SELECT COUNT(n) from Noleggio n " +
            "WHERE  n.libroId = ?1 AND n.utenteId=?2 AND CURRENT_DATE() BETWEEN ?3 AND ?4")

    Long countByUtenteIdAndLibroId(Long idLibro, Long idUtente, LocalDate inizioPrestito, LocalDate finePrestito);

根据您的 JPA 版本,您是否需要编写自己的 LocalDateConverter,如上述回复中所述。

【讨论】:

  • select * from noleggi where id_utente = 1 AND id_libro =25 and GETDATE() BETWEEN inizio_prestito AND fine_prestito
  • 如果我的当前日期在我的两个日期之间,我的查询必须计算到数据库中,该数据库引用了具有该特定 bookID 的 UserID
  • 我试过 @Query(value = "SELECT COUNT(n) FROM Noleggio n WHERE idutente= :idUtente AND idlibro = :idLibro AND :data BETWEEN n.inizioPrestito AND n.finePrestito") Long countByNoleggioUtenteIdAndLibroId (@Param("idUtente") Long idUtente, @Param("idLibro") Long IdLibro, @Param("data")LocalDate data);
  • 错误是:com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'idutente'。
  • 好的,现在对我来说更清楚了。此错误表示您的表中没有名称为 idutente 的列。如果需要,请检查并更正名称。
【解决方案2】:

您需要实现AttributeConverter<LocalDate, Date> 接口及其两个方法convertToDatabaseColumnconvertToEntityAttribute

import java.sql.Date;
import java.time.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();
    }
}

请参阅此链接了解更多详情。 https://thoughts-on-java.org/persist-localdate-localdatetime-jpa/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2018-07-25
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多