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

没有联接的QueryDSL访问Id列

邹华池
2023-03-14

我们有一个例子,我们要查询出历史信息,我们希望使用QueryDSL而不是原始SQL。历史表中的数据包含原始记录的id(Hibernate ENVERs),如果发生删除,则删除实际记录,但ENVERs记录包含原始id。

我们面临的问题是,由于创建Q类的实体只引用外键,这将强制SQL中的联接。由于使用Hibernate,我们无法引用多个字段的列。

@Entity
@Table=name = "foo")
public class Foo {
    @Id
    @Column(name = "foo_id", nullable = false)
    private Long fooId;

}

@Entity
@Table=name = "foo_bar")
public class FooBar {
    @Id
    @Column(name = "foo_bar_id", nullable = false)
    private Long fooBarId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "foo_id")
    private Foo foo;
}
HibernateQuery dsl = createHibernateQuery();
dsl
    .from(qFooBar)
    .where(qFooBar.foo.fooId.eq(id))
;
HibernateQuery dsl = createHibernateQuery();
dsl
    .from(qFooBar)
    .where(qFooBar.fooId.eq(id))
;
    null

共有1个答案

徐学潞
2023-03-14

我不一定会对QueryDSL说话;然而,传统的Envers API确实提供了这种开箱即用的功能。

假设您的示例基于关联的标识符,那么您可以使用relatedID谓词来实现您的目标:

List results = auditReader.createQuery()
    .forRevisionsOfEntity( FooBar.class, true, false )
    .add( AuditEntity.relatedId( "foo" ).eq( fooId ) )
    .getResultList();

这将返回审计历史记录中的所有foobar实例(不包括删除),其中foobar与使用标识符fooidfoo相关。

List results = auditReader.createQuery()
    .forRevisionsOfEntity( FooBar.class, true, false )
    .traverseRelation( "foo", JoinType.INNER )
    .add( AuditEntity.property( "somePropertyOnFoo" ).eq( someValue ) )
    .up()
    .getResultList();

因此,除非存在无法使用Envers query API完成查询的特定用例,否则我认为没有必要使用QueryDSL库,并且本机AuditReader接口提供了所需的所有工具。

 类似资料:
  • 我试图将QueryDSL与Spring Data JPA一起使用。

  • 我只想检查一下QueryDSL版本3.1.1。-是否仍然不可能与子查询连接,就像这里的答案所写的:JPQL/querydsl:join subquery and get aliased column

  • 我希望为结果提供内容过滤。我的(为简洁起见而编辑)实体如下所示: 节点: 场景: 来源: 下面是我希望实现的筛选器的一个示例。 给定一个SourceTypes集合,我希望选择所有场景,这样每个场景都会被其中一个类型的源引用。我使用QueryDSL和以下谓词实现了这一点: 一系列这些谓词被组合起来给出一个整体查询。即使只选择一个SourceType,结果查询看起来也是这样: 我相信上面发生的是交叉连

  • 我正在尝试在我的Spring数据服务中使用查询DSL来实现类似于SQL的查询 成员可以是项目或黑客马拉松的成员。项目是黑客马拉松的一部分。我试图找到哈查顿和子项目的所有成员。 因为谓词产生了交叉连接,所以QueryDslPredicateExecutor接口对我不起作用: 我尝试过使用JPAQuery来手动管理连接策略,但是也遇到了同样的问题: Hibernate:选择memberenti0_.i

  • 我正在尝试转换QueryDSL (JPA,Hibernate provider,Oracle database)中的以下SQL查询: 我的java代码: 它编译得很好,但我得到了一个运行时异常 ORA-00904:“公司_”。“ID”:无效标识符 这是根据Hibernate日志输出生成的查询: 如果我在Oracle中手工运行这个查询,我会得到同样的错误。不明白company的两个无用连接(comp

  • 我想优化一个queryDSL+Spring数据查询。目前我使用BooleanBuilder作为谓词,这很好,但是它连接了太多的表。我不需要表中的所有列,也不需要某些表。我相信使用投影会减少加入的表的数量。 那么,如何使QueryDSL连接表而不是从所有表中进行选择呢?我尝试优化查询是否正确?投影有意义吗?