我使用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(字符串属性,对象值)这样的通用方式?
发布于 2014-01-10 07:42:47
在我看来,最简单的方法是使用Specification。你必须让你的接口扩展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")));发布于 2014-01-09 23:47:13
您可以使用参数声明查询。您可以使用更复杂的方法,但是使用JpaRepository查询方法只能查询现有的实体字段。
@Query("SELECT p FROM Lostcard p WHERE p.yourfield = (:field)")
public Lostcard findByProperty(@Param("field") String property);https://stackoverflow.com/questions/21019673
复制相似问题