Java for Web学习笔记(一二一):搜索(3)JPA的动态条件搜索(下)

147人阅读 评论(0) 收藏 举报
分类:

例子的具体实现

仓库的实现

使用spring data,增加自定义接口SearchableRepository,具体如下:

public interface PersonRepository extends CrudRepository<Person, Long>, SearchableRepository<Person>{
}
public class PersonRepositoryImpl extends AbstractSearchableJpaRepository<Person>{
}

service的实现

public interface PersonService {
	... ...
	Page<Person> searchPeople(SearchCriteria searchCriteria, Pageable pageable);
}
@Service
public class DefaultPersonService implements PersonService{
	@Inject PersonRepository repository;

	......

	@Override
	@Transactional
	public Page<Person> searchPeople(SearchCriteria searchCriteria, Pageable pageable) {
		return this.repository.search(searchCriteria, pageable);
	}
}

controller的实现

public String find(Map<String, Object> model, SearchForm form,Pageable pageable) throws ParseException{
	SearchCriteria criteria = SearchCriteria.Builder.create();
	if(form.isIncludeFirstName())
		criteria.add(new Criterion("firstName", Criterion.Operator.EQ, form.getFirstName()));
	if(form.isIncludeMiddleInitial())
		criteria.add(new Criterion("middleInitial", Criterion.Operator.EQ, form.getMiddleInitial()));
        if(form.isIncludeLastName())
		criteria.add(new Criterion("lastName", Criterion.Operator.EQ, form.getLastName()));
        if(form.isIncludeState())
		criteria.add(new Criterion("state", Criterion.Operator.EQ, form.getState()));
        if(form.isIncludeCountry())
		criteria.add(new Criterion("country", Criterion.Operator.EQ, form.getCountry()));
        if(form.isIncludeBirthDate())
		criteria.add(new Criterion("birthDate", Criterion.Operator.EQ, 
			new Date(new SimpleDateFormat(dateFormatter).parse(form.getBirthDate()).getTime() )));
        if(form.isIncludeGender())
		criteria.add(new Criterion("gender", Criterion.Operator.EQ, form.getGender()));
        if(form.isIncludeRace())
		criteria.add(new Criterion("race", Criterion.Operator.EQ, form.getRace()));
        if(form.isIncludeEthnicity())
		criteria.add(new Criterion("ethnicity", Criterion.Operator.EQ, form.getEthnicity()));
        
        model.put("searchForm", form);
        model.put("results", this.personService.searchPeople(criteria, pageable));
        
	return "people/find";
}

对于OR

我们可以看出通用的Criteria JPA查询功能很强大,但也很危险,用户可能会进行任意的查询,影响了性能。

在例子中,我们只给出了AND的方式,其实OR的方式也是类型。我们看看JPA如何处理AND和OR同时存在的条件。

//【例子1】名字中有n的无论是姓还是名(OR),同时要求生日为b(AND)关系。
criteria.select(root).where(
           builder.or(
               builder.equal(root.get("lastName"), n),
               builder.equal(root.get("firstName"), n)
           ),
           builder.equal(root.get("birthDate"), b)
);
//【例子2】和例子1一样,只要是体现一个AND和OR嵌入的关系
criteria.select(root).where(
           builder.and(
               builder.or(
                   builder.equal(root.get("lastName"), n),
                   builder.equal(root.get("firstName"), n)
               ),
               builder.equal(root.get("birthDate"), b)
           )
);
//【例子3】基于嵌入关系,提供的要给复杂的例子
pageCriteria.select(pageRoot).where(
          builder.or(
              builder.and(
                  builder.equal(expr),
                  builder.equal(expr),
                  pageRoot.get("property").in(expr)
              ),
              builder.or(
                  builder.lessThan(expr),
                  builder.greaterThanOrEqualTo(expr)
              )
          ),
          builder.and(
              builder.equal(expr),
              builder.greaterThan(expr)
          )
);
相关链接:我的Professional Java for Web Applications相关文章
查看评论

用MyEclipse JPA创建项目(一)

MyEclipse 3.15 Style——在线购买低至75折!火爆开抢>> 【MyEclipse最新版下载】 本教程介绍了MyEclipse中的一些基于JPA的功能。 阅读本教程时,了解...
  • AABBbaby
  • AABBbaby
  • 2018-03-09 10:54:59
  • 36

Spring Data JPA @EnableJpaRepositories配置详解

转载地址:http://blog.csdn.net/catoop/article/details/50575038 @EnableJpaRepositories注解用于Srping JPA的...
  • u013473691
  • u013473691
  • 2016-08-29 12:10:53
  • 6759

springMVC+spring data jpa的使用

直入主题,不过多介绍spring的强大之处。 springMVC是一个mvc框架,而spring data jpa则是spring的一个数据层框架,二者整合的优势在于,都是spring产品,整体项目...
  • qq_36779082
  • qq_36779082
  • 2017-07-13 03:07:22
  • 6279

springMVC+jpa+maven框架搭建

为什们开始流行springMVC框架,相比struts前者springMVC在配置上几乎实现了0配置,方便开发者容易理解和配置 1:开始配置 例:搭建一个web工程(springMVC+jpa+m...
  • lishaomin_1988
  • lishaomin_1988
  • 2017-04-11 11:31:42
  • 237

Spring-MVC4 + JPA2 + MySql-5.5 + SLF4J + JBoss WildFly-8.1开发环境搭建

由于面试被问到了Spring4,所以打算把过去Spring3的项目全部升级为Spring4。现将环境搭建过程记录在此。 首先使用Maven Archetype创建项目骨架,执行以下命令: mvn ...
  • tracker_w
  • tracker_w
  • 2014-07-12 15:36:06
  • 4443

富文本编辑+fs操作文件+Buffer练习(头像上传功能)

富文本编辑内容引用=>1.UEditor是由百度web前端研发部开发所见即所得富文本web编辑器下载的文件 引入目录文件进来:文件上传功能引用文件: require(‘../ueditor/’);...
  • qq_26766283
  • qq_26766283
  • 2017-06-06 00:42:35
  • 7486

Maven + Spring + SpringMVC + Spring JPA <1>

岁数大了,搭个框架用了一天半,跌跌撞撞的,算基本走通,记录下流程和期间用到的问题。 一直懒得用Maven,怕麻烦,这次用是因为Spring官网改版了,必须要用Maven的方式下载,初步用了一下,挺好用...
  • yueritian
  • yueritian
  • 2013-12-03 15:25:35
  • 1286

Spring Data JPA+kkpager实现分页功能

一、Spring Data JPA分页 分页效果如下: 前台表格用的是: Bootstrap 分页插件用的是: kkpager kkpager是一个js...
  • u011781521
  • u011781521
  • 2017-06-11 17:45:02
  • 796

SpringMVC+Apache Shiro+JPA 整合

一、       SpringMVC+Apache Shiro+JPA(hibernate)整合配置 (1)新建Web工程,且导入所需Jar包。(以下截图为真实项目中删减后保留,如有不需要的JAR包...
  • tony168hongweigan
  • tony168hongweigan
  • 2014-07-26 16:50:45
  • 662

SpringMVC+Spring Data JPA+Shiro+EasyUI简单权限管理系统

概述一直想做一个管理系统,希望它简洁,能做一个demo使用。以后在研究学习的时候,可以在此基础上增加代码。我觉得权限管理系统很值得做,因为涉及关系数据库模式的设计,能学到很多东西。万事开头难,先做个简...
  • csujiangyu
  • csujiangyu
  • 2015-09-29 11:30:51
  • 12719
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 497万+
    积分: 5万+
    排名: 58
    博客专栏
    我的公告
    我思故我在,如果一个人无法独立思考,即使熟习各种工具,实质只是工具的一部分,永远无法创造工具。
    文章转载只能用于非商业性质,且不能带有虚拟货币、积分等附加条件;转载必须注明出处。

    我的微博帐号:@恺风Wei
    最新评论
    文章存档