带有changingwhere子句的JPA查询

带有changingwhere子句的JPA查询,jpa,Jpa,我有一些字段数的实体。我的客户希望通过变量where子句获得一些选择 例如,第一次可能是 "where name='John' and id_version=5" 那么名称字段可能根本没有使用 "where id_version=5" 或者可以添加一些新字段 "where id_version=5 and sex='male'" 使用JPA和Spring存储库实现它的最佳实践是什么?在JPA中编写动态查询没有一个最佳实践。但大多数最佳实践将使用JPA标准API或其他替代方法(如Queryd

我有一些字段数的实体。我的客户希望通过变量where子句获得一些选择

例如,第一次可能是

"where name='John' and id_version=5"
那么名称字段可能根本没有使用

"where id_version=5"
或者可以添加一些新字段

"where id_version=5 and sex='male'"

使用JPA和Spring存储库实现它的最佳实践是什么?

在JPA中编写动态查询没有一个最佳实践。但大多数最佳实践将使用JPA标准API或其他替代方法(如Querydsl)

如果您没有一些不寻常的需求,那么使用字符串连接动态生成JPQL查询并不是最佳实践(特别是在使用字符串连接而不是使用索引或命名参数将参数插入查询时)


因为您使用的是Spring,所以它是创建JPA存储库的一个很好的库。它可以与JPA标准API或Querydsl一起使用。如果您只需要为单个实体编写动态查询,这可能有点复杂,但是当您需要为许多实体编写动态查询时,它会变得非常有用。

Spring Data和Querydsl非常适合这种情况。使用Querydsl增强存储库,您可以像这样表示过滤器

repository.findAll(entity.name.eq("John").and(entity.idVersion.eq(5)))

repository.findAll(entity.idVersion.eq(5))

repository.findAll(entity.idVersion.eq(5).and(entity.sex.eq("male")))
这里还有一篇相关的博客文章


这个答案是有偏见的,因为我参与了Querydsl项目。

我现在使用Spring JPA,但我找不到如何使用此框架创建动态更改的查询。@wolandec下面是一篇相关的博客文章,我们在使用Querydsl保存具有复合主键的实体时遇到了一些问题。实际上Querydsl不是问题。问题在于Querydsl为自己订购的Spring数据框架版本。这就是问题所在。