`
leobluewing
  • 浏览: 241334 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

spring-data-jpa 复杂查询的写法(包含or的查询)

 
阅读更多
记录一下,因为之前遇见的spring-data-jpa相关业务都是很简单的处理掉了。


场景如下:很简单的CMS常用查询,栏目下有多个子栏目,子栏目有包含内容。

public class Channel{
....
private String parentIds;//所有的父节点,简化查询策略 例如 0,1,11, 
private List<Channel> channels = Lists.newArrayList(); //所有的儿子栏目
...
}

public class Content{
	private Channel channel; //属于哪个栏目
}


所以比如有如下结构时:栏目A下有两个子栏目B,C;这三个栏目下都有各自的内容, 那么当查询A下的内容时,肯定也是要包含B,C栏目下的内容。

比如说A栏目的id是 10 ,再加上别的查询条件的话, 也就是说 sql 语句肯定是类似:


select * from Content as s where (s.channel.id = 10 or s.channel.parentIds like '%,10,%') and s.yyy = 'xxxxx' and s.xxx = 'yyyy';


想来想去发现实在没有简单的办法做or查询之后跟动态的and查询参数,好像只能自己构造,所以在此记录一下,避免忘记。

此处动态的and 查询条件构造是使用了springside的方法。并且我不知道这样的构造方法是不是spring-data-jpa的标准做法,如果不是,请指正

/**
	 * 查询某个栏目下的所有文章,并且分页。
	 * 
	 * 如该栏目下有子栏目,则需要一起显示
	 * 
	 * @param channelId 栏目id
	 * @param searchParams
	 * @param pageNumber
	 * @param pageSize
	 * @return
	 */
	public Page<Content> getContentListPaged(final Integer channelId,final Collection<SearchFilter> filters,int pageNumber, int pageSize){
		
		return contentDao.findAll(new Specification<Content>(){
			
			@Override
			public Predicate toPredicate(Root<Content> root,
					CriteriaQuery<?> query, CriteriaBuilder builder) {

				//path转化
				List<Predicate> orPredicates = Lists.newArrayList();
				
				Path<String> idPath = root.get("channel").get("id");
				Path<String> parentIdsPath = root.get("channel").get("parentIds");
				
				Predicate p1 = builder.equal(root.get("channel").get("id"), channelId);
				orPredicates.add(builder.or(p1));
				Predicate p2 = builder.like((Path)root.get("channel").get("parentIds"), "%," + channelId + ",%");
				orPredicates.add(builder.or(p2));
				
				//以下是springside3提供的方法
				Predicate o = DynamicSpecifications.bySearchFilter(filters, Content.class).toPredicate(root, query, builder);
				
			    Predicate p = builder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
			    query.where(p,o);
				
				return null;
				
			}
			
		}, new PageRequest(pageNumber - 1, pageSize));
	}


实际查询的输出sql如下,where之前省略:

  where
        content0_.channel_id=channel1_.id 
        and (
            content0_.channel_id=21 
            or channel1_.parentIds like ?
        ) 
        and (
            content0_.title like ?
        ) limit ?



0
0
分享到:
评论
2 楼 endual 2017-10-07  
想要查询这样channel,其子栏目 channels 数列里面的channel的名字包含“新闻”?
请问这要怎么操作?
1 楼 814687491 2013-11-04  
感觉好复杂,不懂你想描述什么!
getContentListPaged(final Integer channelId,final Collection<SearchFilter> filters,int pageNumber, int pageSize){ 
         
        return contentDao.findAll(new Specification<Content>(){ 
             
            @Override 
            public Predicate toPredicate(Root<Content> root, 
                    CriteriaQuery<?> query, CriteriaBuilder builder)


相关推荐

    详解Spring Data JPA动态条件查询的写法

    Spring Data JPA 动态条件查询写法详解 Spring Data JPA 是一个基于 Java Persistence API(JPA)规范的数据访问框架,提供了强大的数据访问功能。在实际开发中,我们经常需要根据不同的条件进行数据查询,而 ...

    spring-boot-3.0.6.zip

    这包括 SpringApplication、Spring Boot Starter、自动配置、Actuator(监控和管理工具)、Spring Data JPA 等。在实际开发中,还需要学习如何创建 RESTful API、处理 Web 请求、使用模板引擎(如 Thymeleaf 或 ...

    JavaEE就业班(夜光)③:SpringData开发.docx

    对于复杂查询需求,Spring Data JPA 提供了 Criteria API 和 Specifications API 等工具。这些工具允许开发者构建动态查询条件,以应对更加灵活的查询需求。 #### 十一、多表操作 多表操作是企业应用中常见的需求...

    SpringBoot-jpa.zip

    Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,可以在几乎不用写实现的情况下实现对数据库的访问和操作,除了CRUD外,还包括分页和排序等一些...

    Spring JPA学习

    综上所述,Spring JPA提供了强大的数据持久化功能,通过其灵活的配置选项和丰富的API,开发人员可以轻松地与数据库交互,实现复杂的业务逻辑需求。理解和掌握这些基本概念和技术对于使用Spring JPA来说至关重要。

    spring boot多数据源配置

    &lt;artifactId&gt;spring-boot-starter-data-jpa &lt;groupId&gt;mysql &lt;artifactId&gt;mysql-connector-java &lt;scope&gt;runtime &lt;groupId&gt;com.oracle.database.jdbc&lt;/groupId&gt; &lt;artifactId&gt;ojdbc10 &lt;scope&gt;runtime ``` ...

    开源博客系统SpringBlog.zip

    Spring MVC Spring Data JPA Hibernate MySQL Spring Data Redis 用于缓存文章 Jade 作为视图模板,我极度不喜欢写 HTML 标签 Bootstrap 没有它我就不会写前端了 这是一个基于 Gradle 的项目,要想...

    Spring Data整合Hibernate.rar

    Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷。可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括...

    HibernateDAO的写法

    - 使用Query和Criteria API进行复杂查询,提高灵活性。 - 实现DAO接口,便于进行依赖注入和单元测试。 - 考虑使用Spring的HibernateTemplate或JPA的EntityManager,它们提供了更高级的事务管理和资源管理功能。 6. ...

    JAVA JAP分页写法大全

    这个压缩包文件名"JAVA JAP分页写法大全"暗示了它可能包含各种不同的分页实现示例,这对于初学者来说是一个极好的学习资源。下面我们将详细探讨Java中常见的分页方法。 首先,我们要理解分页的基本概念。在处理大量...

    商店:spring cloud最佳实践项目实例,使用了spring cloud全家桶,TCC事务管理,EDA事务最终一致性等技术的下单示例

    spring data jpa:数据库稳定连接技术 spring mvc:访问控制层技术 spring cloud robbin:使用客户端负载均衡,进行服务提供者的调用 spring cloud feign:分装了ribbon的使用,直接使用注解的方式,进行调用 弹簧靴...

    J2EE框架考试试题借鉴.pdf

    - Spring框架是一个全面的企业级应用程序开发框架,包含了许多模块,例如Spring MVC、Spring Data、Spring Security等。 - Spring MVC是Spring的核心模块之一,它是一个基于Java的实现了MVC设计模式的请求驱动类型的...

    SpringHibernateJPA源码

    Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷。可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括...

    blog:创建自己的博客_ Spring Boot练习

    这些类通常会包含实体属性,并使用`@Entity`注解标记,以便于Spring Data JPA处理。 4. **仓库(Repository)**:Spring Data JPA允许我们声明式地定义数据库操作。例如,我们可以创建一个`PostRepository`接口,...

Global site tag (gtag.js) - Google Analytics