Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 JPA Spring启动的动态位置_Java_Spring_Spring Boot_Jpa - Fatal编程技术网

Java JPA Spring启动的动态位置

Java JPA Spring启动的动态位置,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我的Spring Boot应用程序中有一个表和Pojo,如下所示 @Entity @Table(name = "attendance_summary") public class AttendanceSummary implements Serializable { @Id @SequenceGenerator(name = "attendance_summary_id_seq", sequenceName = "attendance_summary_id_seq",

我的Spring Boot应用程序中有一个表和Pojo,如下所示

@Entity
@Table(name = "attendance_summary")
public class AttendanceSummary implements Serializable {

  @Id
  @SequenceGenerator(name = "attendance_summary_id_seq",
    sequenceName = "attendance_summary_id_seq",
    allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE,
    generator = "attendance_summary_id_seq")
  @Column(name = "id", updatable = false)
  public Integer id;

  @Column(name = "emp_id", nullable = false)
  public Integer empId;

  @Column(name = "designation_id")
  public Integer designationId;

  @Column(name = "designation_category_id")
  public Integer designationCategoryId;

  @Column(name = "department_id")
  public Integer departmentId;

  ......
}
现在我想要这些字段的动态输入。这意味着用户可以选择 EMPID、指定ID的列表。。。。或者它们的任何组合,甚至没有。 如果他们没有选择任何字段,我需要返回数据库表中的所有行

但在jpa中,当我们在存储库中编写方法时,我们必须指定字段名,如

public interface AttendanceSummaryRepository extends JpaRepository<Integer,AttendanceSummary>{
     List<AttendanceSummary> findByEmpIdAndDesignationId....(List<Integer> empIdList,List<Integer> designationIdList ... );
}
jpaDataMethods是否有这样做的方法,如果有,如何做。非常感谢您对资源的详细解释/链接


对不起,我的英语很差,如果我不能正确解释我的问题。

您可以使用
@Query
注释来实现这一点。有关更多详细信息,请参阅spring

@Query(value = "from attendance_summary where (emp_id in (?1) or ?1 is null) and (designation_id in (?2) or ?2 is null)" )
查询详情: 在github上使用spring boot、jpa和h2。查找
SchoolController
&
SchoolRepo
类,应用相同的逻辑,端点
\school
将过滤输入ID的结果&
\allschool
将在输入为空时返回所有内容。

查看。它允许您创建动态查询

在您的示例中,类似于此的操作可能会起作用:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<AttendanceSummary> query = cb.createQuery(AttendanceSummary.class);
Root<AttendanceSummary> root = query.from(AttendanceSummary.class);

List<Predicate> predList = new ArrayList<>();
if (empIdList != null) {
    predList.add(root.get('empId').in(empIdList));
}
if (designationIdList != null) {
    predList.add(root.get('designationId').in(designationIdList));
}
// ... You get the idea.

Predicate[] predicates = new Predicate[predList.size()];
predList.toArray(predicates);

query.where(predicates);

return entityManager.createQuery(query).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(AttendanceSummary.class);
Root=query.from(AttendanceSummary.class);
List predList=new ArrayList();
if(empIdList!=null){
predList.add(root.get('empId').in(empIdList));
}
如果(指定数据列表!=null){
predList.add(root.get('designationId')。在(designationId列表)中);
}
// ... 你明白了。
谓词[]谓词=新谓词[predList.size()];
predList.toArray(谓词);
where(谓词);
返回entityManager.createQuery(query.getResultList();

例如,我在这里只列出了2/3个字段。实际上,还有更多的领域。因此,如果我这样做,我必须处理大量的情况(因为用户可以选择任意数量的字段进行搜索。例如:他们选择了emp_id和designation_id,但不是department id。或者department_id和designation_id,而不是任何其他字段)。另外,我被告知@Query中的值需要是静态的。因此,我不能根据输入链接逻辑。有没有更干净的方法可以做到这一点?我更改了查询以获得所需的结果,因此您不必进行多个方法签名。db字段值永远不会为null。如果任何字段的用户输入为空,则必须将其从搜索参数中排除。所以这个查询不起作用。你没有尝试这个解决方案,也没有密切关注这个查询,我不是在比较DB字段是否为null,而是比较输入本身。为查询添加了解释,这样您就可以了解它是如何处理null filterI的。由于以下原因导致出现此异常:org.postgresql.util.PSQLException:ERROR:syntax ERROR at或near”)“很抱歉,我对spring引导没有太多经验。什么是实体经理?看起来你把它注射到这里是为了使用它。您能给我指一些参考资料,让我了解更多信息吗?实体管理器可以访问您的实体,如AttendanceSummary,并可以为您创建SQL查询。演示了如何使用spring注入实体管理器。我想我在使用实体管理器时遇到了一些问题。我按照本指南创建了存储库及其相应的实现。[link]我使用上述逻辑构造查询。遗憾的是,我的代码在CriteriaBuilder cb=entityManager.getCriteriaBuilder()行上得到了一个空指针;我打开了调试,发现我的entityManager为空。检查问题并将让您知道
SELECT * #implicit so removed
FROM   attendance_summary 
WHERE  ( emp_id IN (?1) #true when IDs are not null, thus apply filter
          OR ?1 IS NULL #true when user input null, return all rows ) 
       AND ( designation_id IN (?2) #true when IDs are not null, thus apply filter
              OR ?2 IS NULL #true user input null, return all rows) 
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<AttendanceSummary> query = cb.createQuery(AttendanceSummary.class);
Root<AttendanceSummary> root = query.from(AttendanceSummary.class);

List<Predicate> predList = new ArrayList<>();
if (empIdList != null) {
    predList.add(root.get('empId').in(empIdList));
}
if (designationIdList != null) {
    predList.add(root.get('designationId').in(designationIdList));
}
// ... You get the idea.

Predicate[] predicates = new Predicate[predList.size()];
predList.toArray(predicates);

query.where(predicates);

return entityManager.createQuery(query).getResultList();