Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建日期为Spring的JPA查询_Java_Spring_Postgresql_Spring Data Jpa_Jpql - Fatal编程技术网

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));