jpa QueryDSL,指定连接投影

uoifb46i  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(112)

我尝试使用QueryDSL来获取实体集合(表Category),其中每个实体都与其他类型的实体(表User)有@OneToMany关联,并使用连接来一次性获取所有实体。
问题是第二个实体(用户)包含不应包含的CLOB字段。我不想在查询中包含它们。假设有以下QueryDSL查询:

JPAQuery<CategoryEntity> baseQuery = new JPAQuery<>(entityManager)
                .select(QCategoryEntity.categoryEntity)
                .from(QCategoryEntity.categoryEntity)
                .leftJoin(QCategoryEntity.categoryEntity.users, QUserEntity.userEntity)
                .where(somePredicate);

QueryDSL将生成类似于

SELECT categoryen0_.id, (...), useren0_.id, (...) 
FROM category categoryen0 
LEFT OUTER JOIN user useren0 ON ...
WHERE ...
  • 如何将特定的预测应用于此查询以排除CLOB数据?*

备注:

  • 我试图避免原生查询和更改域模型。
  • 我还没有找到对连接本身使用投影的方法。
  • JPQL不支持在连接中使用子查询,因此QueryDSL也不支持。
htrmnn0y

htrmnn0y1#

结果发现,由于我使用了提取连接,这使得我无法使用投影,所以这个方法并不奏效。解决这个问题需要使用基本连接,然后手动重建关系。

Collection<Tuple> tuples = new JPAQuery<>(entityManager)
                .select(QCategoryEntity.categoryEntity, Projections.constructor(UserEntity.class, <constructor arguments>)
                .from(QCategoryEntity.categoryEntity)
                .join(QCategoryEntity.categoryEntity.users, QUserEntity.userEntity)
                .where(somePredicate);

相关问题