querydsl sub query

多对多关系
List<UserTag> utList = new ArrayList<UserTag>();
				for(Long id : tagIdList){
					UserTag ut = this.userTagService.getDao().findOne(id);
					utList.add(ut);
				}
				QUser qUser = QUser.user;
				QUserTags qUserTags = QUserTags.userTags;
				//添加子查询
				ListSubQuery<User> user = new JPASubQuery()
				  .from(qUserTags)
				  .where(qUserTags.tag.in(utList)).list(qUserTags.user);
				e = (e==null)?e = qUser.in(user):e.and(e = qUser.in(user));

一对多关系:

QDiscussion qDiscussion = QDiscussion.discussion;
			ListSubQuery<Topic> topic = new JPASubQuery()
			  .from(qDiscussion)
			  .where(qDiscussion.content.contains(discussion)).list(qDiscussion.topic);
			e = (e==null)?e = qTopic.in(topic):e.and(e = qTopic.in(topic));
		}


### 关于 Querydsl 查询的使用方法 #### 1. 配置依赖 为了能够顺利使用 Querydsl 进行开发,项目中需要引入相应的 Maven 或 Gradle 依赖配置[^1]。 对于 Maven 用户而言,在 `pom.xml` 文件内添加如下依赖: ```xml <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>mavenapt-plugin</artifactId> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>QProcessor</processor> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 而对于采用 Gradle 构建工具的情况,则可以在 `build.gradle` 中加入下面的内容来完成设置: ```groovy dependencies { implementation 'com.querydsl:querydsl-jpa' } apply plugin: 'java' sourceSets { main.java.srcDirs += 'src/main/generated' } ``` #### 2. 创建查询实例 一旦完成了上述准备工作之后就可以着手编写具体的业务逻辑代码了。这里展示了一个简单的例子用于说明如何利用 Querydsl 实现带分页功能的数据检索操作[^2]。 假设存在一个名为 `UserRepositoryCustomImpl` 的类实现了自定义仓库接口中的某些复杂查询方法,那么这部分实现可能会像这样写: ```java import com.querydsl.core.types.dsl.BeanPath; import com.querydsl.jpa.impl.JPAQueryFactory; public class UserRepositoryCustomImpl implements UserRepositoryCustom { private final JPAQueryFactory queryFactory; public UserRepositoryCustomImpl(EntityManager entityManager) { this.queryFactory = new JPAQueryFactory(entityManager); } @Override public Page<UserDTO> findUsersByCriteria(Pageable pageable, Map<String, Object> criteriaMap) { QUser user = QUser.user; // 假设 User 是实体对应的 Q 类型 BooleanBuilder predicate = new BooleanBuilder(); // 动态构建查询条件... if (criteriaMap.containsKey("name")) { String name = (String) criteriaMap.get("name"); predicate.and(user.name.containsIgnoreCase(name)); } List<UserDTO> content = queryFactory.select(new QUserDTO( user.id, user.username, user.email)) .from(user) .where(predicate) .orderBy(SortClauseTransformer.toOrderSpecifiers(pageable.getSort(), user)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); long total = queryFactory.selectOne() .from(user) .where(predicate) .fetchCount(); return new PageImpl<>(content, pageable, total); } } ``` 这段代码展示了怎样通过组合多个字段作为过滤条件来进行精确匹配以及模糊搜索;同时也体现了分页机制的应用方式——即先计算满足给定约束条件下记录总数再取出指定范围内的条目集合返回给调用者处理显示事宜[^3]。 另外值得注意的是,除了基本 CRUD 操作之外,Querydsl 还支持诸如聚合函数、连接表关联等多种高级特性,这使得开发者能够在不牺牲性能的前提下更加灵活高效地操纵数据库资源[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值