Java 创建日期为Spring的JPA查询
这就是我的实体的外观:Java 创建日期为Spring的JPA查询,java,spring,postgresql,spring-data-jpa,jpql,Java,Spring,Postgresql,Spring Data Jpa,Jpql,这就是我的实体的外观: @Entity public class Registration { @Id @GeneratedValue private Integer id; @org.springframework.format.annotation.DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate date; } 这就是我的回购协议的样子: @Query(value = "SELECT * FROM registration
@Entity
public class Registration {
@Id
@GeneratedValue
private Integer id;
@org.springframework.format.annotation.DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
}
这就是我的回购协议的样子:
@Query(value = "SELECT * FROM registration WHERE MONTH(date) = ?1 AND YEAR(date) = ?2")
List<Registration> findAll(Integer month, Integer year);
@Query(value=“SELECT*FROM registration,其中月(日期)=?1和年(日期)=?2”)
列出findAll(整数月、整数年);
这将是一项服务:
public List<Registration> getCurrentRegistration() {
LocalDate today = LocalDate.now();
return registrationRepository.findAll(today.getMonth().getValue(), today.getYear());
}
public List<Registration> getRegistrations(Integer month, Integer year) {
return registrationRepository.findAll(month, year);
}
公共列表getCurrentRegistration(){
LocalDate today=LocalDate.now();
返回registrationRepository.findAll(today.getMonth().getValue(),today.getYear());
}
公共列表getRegistrations(整数月、整数年){
返回registrationRepository.findAll(月、年);
}
如何将本机查询更改为JPA查询?
JPA查询能否在postgresql和hsqldb上工作?
为什么JPA查询最适合spring应用程序?(或者为什么不是)您可以使用QueryDSL JPA()来定义谓词:
Predicate createPredicate(Integer month, Integer year) {
return QRegistration.date.year().eq(year).and(QRegistration.date.month().eq(month));
}
然后,使您的回购扩展QueryDSL谓词执行器:
public interface RegistrationRepository extends JpaRepository<Registration>, QueryDslPredicateExecutor {
// Your query methods here
}
有关在Spring中使用QueryDSL的更多信息,请参见此处:创建一个规范类,并在其中编写以下规范方法
import javax.persistence.criteria.Predicate;
import org.springframework.data.jpa.domain.Specification;
public class RegistrationSpecification {
public static Specification<Registration > registrationSpecForDate(
LocalDate invoiceDate ) {
return (root, cq, cb) -> {
List<Predicate> predicates = new ArrayList<Predicate>();
if (invoiceDate!=(null)) {
predicates.add(cb.greaterThanOrEqualTo(root.get("date"),
invoiceDate));
}
return cb.and(predicates.toArray(new Predicate[0]));
};
}
import javax.persistence.criteria.Predicate;
导入org.springframework.data.jpa.domain.Specification;
公共类注册规范{
公共静态规范注册SpecforDate(
LocalDate发票日期){
返回(根、cq、cb)->{
列表谓词=新的ArrayList();
如果(发票日期!=(空)){
add(cb.greaterThanOrEqualTo(root.get(“date”),
发票日期);
}
返回cb.and(谓词toArray(新谓词[0]);
};
}
然后在您的存储库中,将此规范注入JPA的findAll()方法
`public List getRegistrations(LocalDate){
返回
registrationRepository.findAll
(注册规范.注册日期);
`大致相同:您的JPA提供商是否支持函数<代码>月代码>和<代码>年代码>?因为它们不是标准的JPA函数。当您查看JPA文档时,您尝试了什么?我还没有尝试太多。我注意到我的解决方案(本机查询适用于hsqldb,不适用于postgresql).我是JPA新手,这就是我问你的原因。通常我只是使用CRUD或JPA存储库创建查询,比如FindByName(字符串名称);等等。这就是我的知识非常基本的原因。你能说什么样的库谓词吗?我的意思是我需要什么样的导入(或者依赖性)。请再次检查我的答案,通过添加导入重新发布它。
import javax.persistence.criteria.Predicate;
import org.springframework.data.jpa.domain.Specification;
public class RegistrationSpecification {
public static Specification<Registration > registrationSpecForDate(
LocalDate invoiceDate ) {
return (root, cq, cb) -> {
List<Predicate> predicates = new ArrayList<Predicate>();
if (invoiceDate!=(null)) {
predicates.add(cb.greaterThanOrEqualTo(root.get("date"),
invoiceDate));
}
return cb.and(predicates.toArray(new Predicate[0]));
};
}
`public List<Registration> getRegistrations(LocalDate date) {
return
registrationRepository.findAll
(RegistrationSpecification.registrationSpecForDate(date));