Spring Data JPA - 带有“@Param Date”的自定义@Query不起作用

时间:2016-11-15 15:04:39

标签: spring spring-boot spring-data spring-data-jpa jpql

我创建自定义查询以通过日期获取发票数据,但它返回 null 。我确信我为数据库中存在的查询设置了完全相同的日期。

我使用自定义查询,因为我想要更高级的查询来编写。但是在这个简单的查询中存在问题。这是我的示例代码:

@Query("select i from Invoice i where " +
        "i.expirationDate = :expDate")
Invoice findCompanyInvoiceByDate(@Param("expDate") Date expDate);

我尝试了这段代码,但它也不起作用:

 Invoice findByExpirationDate(Date expirationDate);

我还尝试在Date和@Param之前添加@Temporal(TemporalType.DATE),但结果为null。

3 个答案:

答案 0 :(得分:1)

您应该在日期列中使用@Temporal(TemporalType.TIMESTAMP)。如果仍然不够(仍然返回null),请在columnDefinition注释中添加@Column

完整的工作示例is here注意so-40613171分支。很抱歉奇怪的存储库名称和类命名。它使用了很多案例研究)。粗略的例子:

<强> Employee.java

@Entity
public class Employee {

  @Id
  private Integer id;
  private String name;
  private String surname;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "birth_date", columnDefinition = "DATETIME")
  private Date birthDate;

  // Other fields, getter setter, etc.
}

<强> EmployeeRepository.java

public interface EmployeeRepository 
extends JpaRepository<Employee, Integer> {

  @Query("from Employee e where e.birthDate = :birthDate")
  List<Employee> findEmployeeDataByBirthDate(@Param("birthDate") Date birthDate);
}

示例数据

final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Company companySun = companyRepository.save(new Company(42, "Sun microsystems"));
Company companyGoogle = companyRepository.save(new Company(43, "Google"));

employeeRepository.save(new Employee(101, "James", "Gosling", dateFormat.parse("1970-01-01 17:05:05"), companySun));
employeeRepository.save(new Employee(102, "Paul", "Sheridan", dateFormat.parse("1970-01-01 17:05:05"), companySun));
employeeRepository.save(new Employee(103, "Patrick", "Naughton", dateFormat.parse("1970-01-01 17:05:05"), companySun));

employeeRepository.save(new Employee(201, "Lary", "Page", dateFormat.parse("1970-01-01 17:01:05"), companyGoogle));
employeeRepository.save(new Employee(202, "Sergey", "Brin", dateFormat.parse("1970-01-02 17:02:05"), companyGoogle));

测试代码段

@Test
public void employeService_findByBirthDate() throws ParseException {
    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    List<Employee> result = this.employeeService.findByBirthDate(dateFormat.parse("1970-01-01 17:05:05"));

    Assert.assertEquals(3, result.size());
}

如果你运行它,测试就会通过。

HTH

答案 1 :(得分:1)

我只是将日期用作字符串并使用了nativeQuery = true。它对我有用。

@Query(value ="select * from table st where st.created_date >= ?1", nativeQuery = true)
    List<YourObject> findAllByCreatedDate(@Param("createdDate") @DateTimeFormat(iso = ISO.DATE) String createdDate);

答案 2 :(得分:0)

我找到了对此问题有用的答案here

如果您使用“日期”类型,我认为问题中的代码应该有效,但对于“datetime”,您应该在查询中使用“between”或类似的东西。我找到了适合我的解决方案,这就是代码:

@Query("select i from Invoice i where " +
        "i.expirationDate >= :todayMidnight and i.expirationDate < :tomorowMidnight " +
        "order by expirationDate DESC")
List<Invoice> findCompanyInvoiceByDate(@Param("todayMidnight") Date todayMidnight, @Param("tomorowMidnight") Date tomorowMidnight);