使用spring-data进行通用搜索

时间:2014-01-09 12:01:46

标签: spring spring-data

我使用的Spring数据非常有趣,但有一个问题我想要一种通用的方法来搜索实体的字段。

我有一个有很多字段的实体

public class Lostcard implements java.io.Serializable {
    private Integer id;
    private String nom;
    private String prenom;
    private String cin;
    @DateTimeFormat(pattern = "MM/dd/yyyy")
    private Date dateDeclaration;
    @DateTimeFormat(pattern = "MM/dd/yyyy")
    private Date dateDuplicata;
    private String annexeAdmin;
[...]

所以我想这样做:

public interface LostcardRepository extends JpaRepository<Lostcard, Integer> {

List<Lostcard> findByNom(String nom);
List<Lostcard> findByPrenom(String prenom);
List<Lostcard> findByCin(String cin);
    [...]
}

没有像findByProperty(String属性,Object value)这样的通用方法吗?

2 个答案:

答案 0 :(得分:6)

我认为最简单的方法是使用规范。你必须使你的接口扩展JpaSpecificationExecutor,然后你可以使用自己的规范来执行查询。

public interface LostcardRepository extends JpaRepository<Lostcard, Integer>, JpaSpecificationExecutor<Lostcard> {
...
}

然后实现类似下面的类:

public class PropertySpecifications {
    public static Specification<Lostcard> byProperty(final String propertyName, final Object propertyValue) {
      return new Specification<Lostcard>() {
        @Override
        public Predicate toPredicate(Root<Lostcard> candidateRoot, CriteriaQuery<?>  criteriaQuery, CriteriaBuilder criteriaBuilder) {
          return criteriaBuilder.equal(candidateRoot.get(propertyName), propertyValue);
        }
      };
    }
}

然后你可以执行查询:

lostcardRepository.findAll(Specifications.where(PropertySpecifications.byProperty("property", "value")));

答案 1 :(得分:0)

您可以使用参数声明查询。您可以使用它变得更复杂,但使用JpaRepository查询方法只能查询现有的实体字段。

@Query("SELECT p FROM Lostcard p WHERE p.yourfield = (:field)")
public Lostcard findByProperty(@Param("field") String property);