gpt4 book ai didi

java - QueryDSL - 谓词转换 : change root path and check structure

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:12 25 4
gpt4 key购买 nike

我正在使用这个很棒的库,但我有一个问题。

我正在实现 DTO 模式,因此我使用另一个项目使用命名约定将 EJB 自动转换为 DTO。

然后,我想查询 DTO 并获取真实结果(EJB 查询)。

我在实体上使用 JPAAnnotationProcessor 实现了 QueryDSL,在 DTO 上使用了 QuerydslAnnotationProcessor。

例如:

  • 实体用户(长 ID、字符串用户名、站点)
  • DTO UserDto(长 id, 字符串用户名, 字符串站点名称)

转换对象很好,“siteName”自动匹配“site.name”。

因此,我输入了一个 QueryDSL 查询,如下所示: userDto.id.gt(20).and(userDto.username.like("a%")).and(userDto.siteName.like("%b"));

我正在寻找一种方法来构建相应的实体查询

我唯一的想法是:

  • 克隆查询
  • 将路径“userDto”更改为“user”
  • 验证每个谓词以了解属性是否存在以及类型是否匹配

有什么办法可以做到这一点或达到我的目标吗?

谢谢

最佳答案

由于这仍然是相关且未记录的功能,而且 Timo 的回答虽然很有帮助,但非常神秘,因此具体操作方法如下:

首先,扩展ReplaceVisitor:

private class CustomReplaceVisior extends ReplaceVisitor<Void> {
@Override
public Expression<?> visit(Path<?> path, @Nullable Void context) {
// The map Timo mentioned to transform paths:
Map<Path<?>, Path<?>> map = Map.of(
QUser.user.id, QUserDto.userDto.id,
QUser.user.name, QUserDto.userDto.name
);
if (map.contains(path)) {
return map.get(path);
} else {
return super.visit(path, context);
}
}
}

然后像这样使用它:

CustomReplaceVisior replaceVisitor = new CustomReplaceVisior();
Predicate userPredicate = QUser.user.id.eq(2).and(QUser.user.name.eq("Somename"));
Predicate userDtoPredicate = (Predicate) userPredicate.accept(replaceVisitor, null);

关于java - QueryDSL - 谓词转换 : change root path and check structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com