当前位置: 首页 > 知识库问答 >
问题:

将WHERE子句作为HQL字符串从Criteria或:Dynamic WHERE子句在select中使用动态列

岳浩穰
2023-03-14

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

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

共有1个答案

孙成益
2023-03-14

您需要使用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 { }
<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>
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);
 类似资料:
  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。

  • 问题内容: 我想编写一个方法,该方法返回按字段“ serviceId”分组的最后添加的对象的列表。 以下HQL可以使用,但我想使用Criteria API编写: 像这样: 提前致谢。 编辑: 现在,我需要使用eclipselink API = /的类似查询, 基本上,我需要最后N行(最大日期),该状态是下面所述的五行之一,按serviceId列分组。 由于我的经验不足,这是我所能做到的最好的: 缺

  • 问题 你希望创建一个字典来构造动态的where子句并且希望能够在查询语句中使用。 解决 >>> import web >>> db = web.database(dbn='postgres', db='mydb', user='postgres') >>> where_dict = {'col1': 1, col2: 'sometext'} >>> db.delete('mytable', whe

  • 问题内容: 我试图建立一个查询,其中基于用户选择从客户端发送一些字段。我计划根据用户的选择创建一个动态查询。尽管我可以简单地用一些Java代码来完成它,并且让hibernate为我激发该查询并返回结果。 我的问题是,我可以使用内置hibernate机制来做同样的事情。例如我会得到一张地图说 唯一的区别是地图可以包含的值的数量,并基于此我想创建一个查询 提前致谢 问题答案: 通过使用条件,这应该不成

  • 我将Gatling与JDBC feeder一起使用,并希望根据之前请求的响应动态地向JDBC feeder的where子句添加一个参数。这里是我的例子,我试图做一个帖子,创建一个用户,然后让提要使用create user请求返回的userId获取用户生成的UUID,然后用UUID发布一些数据。 我已经核实了以下内容: 1)用户数据确实在表单帖子上正确插入数据库2)用户ID从表单帖子返回3)用户ID

  • 为什么可以在where子句中包含而只保留字母? 编辑1这里是解释: