gpt4 book ai didi

java - 从 Criteria 或 : Dynamic WHERE clause with dynamic columns in select 获取 WHERE 子句作为 HQL 字符串

转载 作者:行者123 更新时间:2023-11-30 08:07:51 27 4
gpt4 key购买 nike

我想为我的应用程序构建过滤器搜索。但是,有一些限制。我必须能够动态添加条件以及动态修改我想要获取的列和连接。

我尝试使用带有规范的 JPA 存储库(来自 Spring Data),并且它根据需要构建 WHERE 子句,但是我无法控制哪些列以及哪些内容将 Hibernate 问题连接到数据库。

我还尝试使用带有投影的 Hibernate Criteria API。发出的查询符合预期,我可以完全控制所选列和联接以及 WHERE 子句,但是,事实证明,结果转换对于解析嵌套对象来说太麻烦了(我尝试使用自定义结果转换器,但为了无济于事,对于单个级别的对象,默认行为很好)。

我现在的“解决方案”是根据情况构建 HQL 字符串。但是,我已经编写了用于构建 WHERE 子句的代码,我想知道是否有办法重用它(例如,从 Spring 规范的谓词或 Hibernate 限制中获取 HQL 字符串)。

当然,如果有更好的方法来完成这一切,如果您分享,我将不胜感激。

最佳答案

您需要使用QueryDSL .

第 1 步: 添加 com.mysema.querydsl:querydsl-aptcom.mysema.querydsl:querydsl-corecom.mysema.querydsl:querydsl-jpa 依赖于您的项目。

第 2 步:向您希望运行动态查询的实体类添加 @QueryEntity 注释。如果查询将包含嵌套类,请将注释也添加到嵌套实体类中。下面是一个例子:

@Entity
@QueryEntity
@Table(name = "users")
public class User {
@OneToMany
private Address address;
}

@Entity
@QueryEntity
@Table(name = "address")
public class Address {
@ManyToOne
private Country country;
}

@Entity
@QueryEntity
@Table(name = "country")
public class Country { }

第 3 步:在 process 阶段运行 com.mysema.maven:apt-maven-plugin Maven 插件,如下所示:

<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.QuerydslAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

第 4 步:更改 Spring Data JPA 存储库接口(interface)以扩展 QueryDslPredicateExecutor

interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {}
<小时/>

完成此设置后,APT 插件将为每个用 QueryEntity 注释的类生成 Q 类。然后,您可以使用这些类生成动态查询。例如:

QUser user = QUser.user;

BooleanExpression query = and(eq(user.active, Boolean.TRUE), eq(user.address.country.name, "Belgium"));

Collection<User> activeUsersFromBelgium = userRepository.findAll(query);

关于java - 从 Criteria 或 : Dynamic WHERE clause with dynamic columns in select 获取 WHERE 子句作为 HQL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30842571/

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