Spring数据JPA带有动态where子句

我有一个基本的存储库,比如说IBaseRepository

 public interface IBaseRepository<T extends BaseEntity, PK extends Serializable> extends JpaRepository, JpaSpecificationExecutor { } 

现在每个存储库类,例如UserRepository从此基本存储库扩展。 我怎样才能添加一般的方法

 T findOne(String filter, Map params); 

对于所有inheritance的类,以便调用

 Map params = new HashMap(); params.put("username","Lord"); params.put("locked",Status.LOCKED); userRepo.findeOne("username = :username AND status = :locked",params); 

用动态where子句返回一条记录。

你可以做以下

 import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.NoRepositoryBean; import java.io.Serializable; import java.util.Map; /** * Created by shazi on 1/11/2017. */ @NoRepositoryBean public interface IBaseRepository extends JpaRepository, JpaSpecificationExecutor { T findOne(String filter, Map params); } 

并按如下方式实施。

 import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import javax.persistence.EntityManager; import javax.persistence.Query; import java.io.Serializable; import java.util.Map; /** * Created by shazi on 1/11/2017. */ public class BaseRepositoryImpl extends SimpleJpaRepository implements IBaseRepository { private final EntityManager entityManager; private final JpaEntityInformation entityInformation; public BaseRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); // Keep the EntityManager around to used from the newly introduced methods. this.entityManager = entityManager; this.entityInformation = entityInformation; } @Override public T findOne(String filter, Map params) { final String jpql = "FROM " + entityInformation.getEntityName() + " WHERE " + filter; Query query = entityManager.createQuery(jpql); for (Map.Entry value:params.entrySet()) { query.setParameter(value.getKey(), value.getValue()); } return (T) query.getSingleResult(); } } 

并按如下方式配置它

 @Configuration @EnableJpaRepositories(repositoryBaseClass = BaseRepositoryImpl.class) @EnableTransactionManagement public class RepoConfig { 

或者用XML

  

最后你可以按如下方式使用它;

 User found = userRepository.findOne("name = :name", Collections.singletonMap("name", "name")); 

但是你必须确保你的查询WHERE是这样的,Query总是只返回1个结果。 看这篇文章