Java 带动态where子句的Spring数据JPA

Java 带动态where子句的Spring数据JPA,java,spring,spring-data-jpa,jpql,Java,Spring,Spring Data Jpa,Jpql,我有一个基本存储库,比如说IBaseRepository,它是 public interface IBaseRepository<T extends BaseEntity<PK>, PK extends Serializable> extends JpaRepository<T, PK>, JpaSpecificationExecutor<T> { } 对于所有继承的类,以便调用 Map<String,Object> p

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

public interface IBaseRepository<T extends BaseEntity<PK>, PK extends Serializable>
      extends JpaRepository<T, PK>, JpaSpecificationExecutor<T>  {
}
对于所有继承的类,以便调用

Map<String,Object> params = new HashMap<String,Object>();
params.put("username","Lord");
params.put("locked",Status.LOCKED);
userRepo.findeOne("username = :username AND status = :locked",params);
Map params=newhashmap();
参数put(“用户名”、“主”);
参数put(“锁定”,状态为锁定);
userRepo.findeOne(“用户名=:用户名和状态=:锁定”,参数);

返回一条带有动态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<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {

    T findOne(String filter, Map<String, Object> params);

}
或者使用XML

<repositories base-class="….BaseRepositoryImpl" />

但是您必须确保您的查询WHERE是这样的,即查询总是只返回1个结果。参见此

您可以执行以下操作

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<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {

    T findOne(String filter, Map<String, Object> params);

}
或者使用XML

<repositories base-class="….BaseRepositoryImpl" />

但是您必须确保您的查询WHERE是这样的,即查询总是只返回1个结果。看到这个

我认为你做不到这一点,你应该使用JPA查询。你做不到这一点,JPA查询是为了性能而预编译的。如果你想要任何动态的东西,你必须自己构建一个查询。谢谢大家。我想是的。你可以。我不认为你可以这样做,你应该使用JPA查询。你不能这样做,JPA查询是为了性能而预编译的。如果你想要任何动态的东西,你必须自己构建一个查询。谢谢大家。我想是的,你可以。
<repositories base-class="….BaseRepositoryImpl" />
User found = userRepository.findOne("name = :name", Collections.singletonMap("name", "name"));