Database Spring MVC-使用Param进行搜索
我想从数据库中搜索一些东西。例如,我有三个文本字段 名、姓和性别 如果我在那里输入 一些姓,一些姓,男性我想搜索所有具有特定姓名和性别的人,并显示出来我该怎么做? 注:我刚刚开始学习Spring,谢谢 控制器:Database Spring MVC-使用Param进行搜索,database,spring,spring-mvc,Database,Spring,Spring Mvc,我想从数据库中搜索一些东西。例如,我有三个文本字段 名、姓和性别 如果我在那里输入 一些姓,一些姓,男性我想搜索所有具有特定姓名和性别的人,并显示出来我该怎么做? 注:我刚刚开始学习Spring,谢谢 控制器: @RequestMapping(value = "/student/search", method = RequestMethod.GET) public String searchStudent(@Param("name") String name, @Param("type"
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("type", gender);
model.put("students",studentRepository.findAll(StudentSpecification.search(params)));
return "/students/list";
}
}
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
model.put("students",studentRepository.findAll(name, type));
return "/students/list";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
Map params=新的HashMap();
参数put(“名称”,名称);
参数put(“类型”,性别);
model.put(“学生”,studentRepository.findAll(StudentSpecification.search(params));
返回“/学生/名单”;
}
}
规格:
public static Specification<Student> search(final Map<String, String> params) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<Predicate>();
params.forEach((k, v) -> {
if (StringUtils.equals(k, "name")) {
if (StringUtils.isNotBlank(v)) {
Predicate hasFirstName =
criteriaBuilder.like(root.join("user").<String>get("firstName"), "%" + v + "%");
Predicate hasLastName =
criteriaBuilder.like(root.join("user").<String>get("lastName"), "%" + v + "%");
predicates.add(criteriaBuilder.or(hasFirstName, hasLastName));
}
}
});
return criteriaBuilder.and(predicates.toArray(new Predicate[] {}));
};
}
}
公共静态规范搜索(最终映射参数){
返回(根、查询、准则生成器)->{
列表谓词=新的ArrayList();
forEach参数((k,v)->{
if(StringUtils.equals(k,“name”)){
if(StringUtils.isNotBlank(v)){
谓词名=
criteriaBuilder.like(root.join(“user”).get(“firstName”),“%”+v+“%”;
谓词hasLastName=
criteriaBuilder.like(root.join(“user”).get(“lastName”),“%”+v+“%”;
add(criteriaBuilder.or(hasFirstName,hasLastName));
}
}
});
返回criteriaBuilder.and(predicates.toArray(新谓词[]{}));
};
}
}
您可以使用@Query
在存储库中添加方法执行此操作:
@Query("SELECT e FROM STUDENT e WHERE e.name = ?1 AND e.type = ?2")
public List<student> findAll(String name, String type);
@Query(“从学生e中选择e,其中e.name=?1和e.type=?2”)
公共列表findAll(字符串名称、字符串类型);
在控制器中使用该方法:
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("type", gender);
model.put("students",studentRepository.findAll(StudentSpecification.search(params)));
return "/students/list";
}
}
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
model.put("students",studentRepository.findAll(name, type));
return "/students/list";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
model.put(“学生”,studentRepository.findAll(名称、类型));
返回“/学生/名单”;
}
您可以使用@Query
在存储库中添加方法执行此操作:
@Query("SELECT e FROM STUDENT e WHERE e.name = ?1 AND e.type = ?2")
public List<student> findAll(String name, String type);
@Query(“从学生e中选择e,其中e.name=?1和e.type=?2”)
公共列表findAll(字符串名称、字符串类型);
在控制器中使用该方法:
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("type", gender);
model.put("students",studentRepository.findAll(StudentSpecification.search(params)));
return "/students/list";
}
}
@RequestMapping(value = "/student/search", method = RequestMethod.GET)
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) {
model.put("students",studentRepository.findAll(name, type));
return "/students/list";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
model.put(“学生”,studentRepository.findAll(名称、类型));
返回“/学生/名单”;
}
我从您的代码中推测,您使用的是Spring数据jpa,带有规范,对吗?
如果是这样,您需要生成实体的元模型,如果您使用的是maven,请添加下面的代码,这样就可以了
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>2.0.5</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<processors>
<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>4.3.6.Final</version>
</dependency>
</dependencies>
</plugin>
org.bsc.maven
maven处理器插件
2.0.5
过程
过程
生成源
org.hibernate.jpamodelgen.jpametamodelenticyprocessor
org.hibernate
冬眠
4.3.6.最终版本
我假设您有一个名为Student的实体,这个插件声明将生成一个带有下划线'Student\后缀的classe
然后您可以实现规范接口,类似这样的
public class StudentSpecification {
public static Specification<Student> search(final Map<String, String> params) {
return new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> studentRoot, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate res = null;
if(params.containKey("name"))
res = cb.equal(studentRoot.get(Student_.name), params.get("name"));
if(params.containKey("type"))
if(res ==null)
res = cb.equal(studentRoot.get(Student_.name), params.get("type"));
else
res = cb.and(res, cb.equal(studentRoot.get(Student_.name), params.get("type")));
return res;
}
}
}
interface StudentRepository extends JpaSpecificationExecutor<Student> {
}
公共课堂学生规范{
公共静态规范搜索(最终映射参数){
返回新规范(){
@凌驾
公共谓词toPredicate(Root studentRoot、CriteriaQuery查询、CriteriaBuilder cb){
谓词res=null;
if(参数containKey(“名称”))
res=cb.equal(studentRoot.get(Student.name),params.get(“name”);
if(参数containKey(“类型”))
如果(res==null)
res=cb.equal(studentRoot.get(Student.name),params.get(“type”);
其他的
res=cb.and(res,cb.equal(studentRoot.get(Student.name),params.get(“type”));
返回res;
}
}
}
当然,您的StudentRepository类应该扩展JpaSpecificationExecutor,类似这样的
public class StudentSpecification {
public static Specification<Student> search(final Map<String, String> params) {
return new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> studentRoot, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate res = null;
if(params.containKey("name"))
res = cb.equal(studentRoot.get(Student_.name), params.get("name"));
if(params.containKey("type"))
if(res ==null)
res = cb.equal(studentRoot.get(Student_.name), params.get("type"));
else
res = cb.and(res, cb.equal(studentRoot.get(Student_.name), params.get("type")));
return res;
}
}
}
interface StudentRepository extends JpaSpecificationExecutor<Student> {
}
interface StudentRepository扩展了JpaSpecificationExecutor{
}
我从您的代码中推测,您使用的是Spring数据jpa,带有规范,对吗?
如果是这样,您需要生成实体的元模型,如果您使用的是maven,请添加下面的代码,这样就可以了
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>2.0.5</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<processors>
<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>4.3.6.Final</version>
</dependency>
</dependencies>
</plugin>
org.bsc.maven
maven处理器插件
2.0.5
过程
过程
生成源
org.hibernate.jpamodelgen.jpametamodelenticyprocessor
org.hibernate
冬眠
4.3.6.最终版本
我假设您有一个名为Student的实体,这个插件声明将生成一个带有下划线'Student\后缀的classe
然后您可以实现规范接口,类似这样的
public class StudentSpecification {
public static Specification<Student> search(final Map<String, String> params) {
return new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> studentRoot, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate res = null;
if(params.containKey("name"))
res = cb.equal(studentRoot.get(Student_.name), params.get("name"));
if(params.containKey("type"))
if(res ==null)
res = cb.equal(studentRoot.get(Student_.name), params.get("type"));
else
res = cb.and(res, cb.equal(studentRoot.get(Student_.name), params.get("type")));
return res;
}
}
}
interface StudentRepository extends JpaSpecificationExecutor<Student> {
}
公共课堂学生规范{
公共静态规范搜索(最终映射参数){
返回新规范(){
@凌驾
公共谓词toPredicate(Root studentRoot、CriteriaQuery查询、CriteriaBuilder cb){