我有一个保存一些逻辑数据的实体:
@Entity
public class Person {
private Long id.
private String name;
private int age;
private String address;
...
}
我创建我的Spring数据接口
@Repository
public interface CardInventoryRepository extends JpaRepository<Person , Long> {
}
例如,我的目的是基于实体的存在值创建动态查询。 如果名称为null,则查询为:
select * from Person p Where p.age=12 AND p.address="adress.."
当地址为空时,查询应为:
select * from Person p Where p.age=12 AND p.name="ALI"
我只想使用非空字段提取数据?
有什么解决方案可以使用spring数据来构建动态查询? 预先感谢
答案 0 :(得分:2)
是的,请看一下Spring Data的QueryDSL支持。您的用例可以通过谓词实现。简而言之,您必须创建一个谓词,在该谓词中您将传递非null字段,然后将该谓词传递给以谓词为参数的findAll方法。您的存储库界面还必须扩展QueryDslPredicateExecutor
答案 1 :(得分:2)
基于Spring文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example
示例查询(QBE)是一种用户友好的查询技术,具有 简单的界面。它允许动态查询创建,但不允许 要求您编写包含字段名称的查询。实际上,查询 通过示例不需要您使用编写查询 商店专用的查询语言。
定义: Example接受一个数据对象(通常是实体对象或它的子类型)和一个说明如何匹配属性的规范。您可以在JPA中使用“按示例查询” 存储库。
为此,请让您的存储库界面扩展QueryByExampleExecutor<T>
,例如:
public interface PersonRepository extends CrudRepository<Person, String>, QueryByExampleExecutor<Person> {
}
这是QueryByExampleExecutor
中可用的方法:
public interface QueryByExampleExecutor<T> {
<S extends T> S findOne(Example<S> example);
<S extends T> Iterable<S> findAll(Example<S> example);
// … more functionality omitted.
}
用法:
Example<Person> example = Example.of(new Person("Jon", "Snow"));
repo.findAll(example);
ExampleMatcher matcher = ExampleMatcher.matching().
.withMatcher("firstname", endsWith())
.withMatcher("lastname", startsWith().ignoreCase());
Example<Person> example = Example.of(new Person("Jon", "Snow"), matcher);
repo.count(example);
更多信息