Java JPA Spring启动的动态位置
我的Spring Boot应用程序中有一个表和Pojo,如下所示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",
@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();