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个结果。 看这篇文章