我使用的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)这样的通用方法吗?
答案 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);