我创建自定义查询以通过日期获取发票数据,但它返回 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。
答案 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);