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

QueryDSL和ManyToMany关系

邢小云
2023-03-14

在一个项目中,我有以下实体:具有连接到关键字的模板部分的模板。这两种关系都是@ManyToMore。一些代码:

@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "TEMPLATE")
public class TemplateEntity extends SystemFlagEntity {

    ...

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
            name = "TEMPLATEPART_CATALOGUE",
            joinColumns = @JoinColumn(name = "C_FK_TEMPLATE", referencedColumnName = "C_I_IDF"),
            inverseJoinColumns = @JoinColumn(name = "C_FK_TEMPLATEPART", referencedColumnName = "C_I_IDF"))
    Set<TemplatePartEntity> templatePartsCatalogue = new HashSet<>();

}

@ToString
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "TEMPLATEPART")
public class TemplatePartEntity extends SystemFlagEntity {

    ...

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
            name = "TEMPLATEPART_KEYWORD",
            joinColumns = @JoinColumn(name = "C_FK_TEMPLATEPART"),
            inverseJoinColumns = @JoinColumn(name = "C_FK_KEYWORD"))
    Set<KeywordEntity> keywords = new HashSet<>();

}

@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "KEYWORD")
public class KeywordEntity extends LabeledEntity {

    ...

}

然后,我尝试使用给定ID查找与某个模板相关的关键字。我使用QueryDSL使用此谓词执行此操作:

public Iterable<KeywordEntity> findCatalogueKeywordsForTemplate(Long id) {
    return findAll(
        QKeywordEntity.keywordEntity.in(QTemplateEntity.templateEntity.templatePartsCatalogue.any().keywords)
            .and(QTemplateEntity.templateEntity.id.eq(id))
    );
}

由于某些原因,谓词处理得根本不好。尝试调用方法时出现此错误:

组织.hibernate.hql.internal.ast.QuerySyntax 异常: 模板实体部分目录未映射 [选择关键字身份\nfrom mypackage.core.domain.model.关键字实体\n存在(选择 1\nfrom 模板实体模板部分类别为templateEntity_templatePartsCatalogue_0\nwhere 关键字templateEntity_templatePartsCatalogue_0.关键字的实体成员)和 templateEntity.id = ?1];嵌套的异常是 java.lang.非法描述异常:组织.Hibernate.hql.internal.ast.QuerySyntax异常: 模板实体.模板部分未映射类别 [选择关键字身份\nf来自 mypackage.core.domain.model.关键字身份关键字存在(选择 1\nf从模板中选择 1\nf从模板中输入内容模板templateEntity_templatePartsCatalogue_0\nwhere 关键字templateEntity_templatePartsCatalogue_0.关键字)和 templateEntity.id = ?1]

看起来它没有很好地处理@ManyToMany关联。关于如何解决这个问题的任何想法?我知道我可以显式使用 JPAQuery,但我想改用谓词

共有1个答案

周健
2023-03-14

在看到< code>QueryDSL的创建者的回答后,我发现我误解了谓词的工作方式。这个查询不需要显式定义多对多关联表:

public Iterable<KeywordEntity> findCatalogueKeywordsForTemplate(Long id) {
    return new JPAQuery<>(entityManager)
            .select(QKeywordEntity.keywordEntity)
            .from(QTemplateEntity.templateEntity)
            .innerJoin(QTemplateEntity.templateEntity.templatePartsCatalogue, QTemplatePartEntity.templatePartEntity)
            .innerJoin(QTemplatePartEntity.templatePartEntity.keywords, QKeywordEntity.keywordEntity)
            .where(interceptPredicate(QTemplateEntity.templateEntity.id.eq(id)))
            .distinct()
            .fetch();
}
 类似资料:
  • 问题内容: 我有一些与关系有关的实体: 和 使用某些模型执行保存模型时,一切正常。表存储这些实体的所有键。但是,使用驱动程序保存模型时,表不会更改。我认为映射存在问题。 问题答案: 那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是一面,因为它包含: 拥有关系的字段。除非关系是单向的,否则为必需。 这意味着是关联的所有者,并且Hibernate仅在维护关联时检查该侧。

  • 我试图存储一个manytomany关系,但它没有存储关系。 下面的代码生成了3个表。 这是我发送到服务器的JSON: {“abbreviatedsequence”:“xdf”,“medals”:[{“name”:“purple”,“id”:1},{“name”:“red”,“id”:2}],“sequence”:“xdfree”,“name”:“savier”} java

  • 它附加在单向@manytomany上,如下所示: 当joinColumns由主键组成时(hibernate只记录它的id),所以我认为问题是由我的JoinTable中有非主列引起的(而hibernate试图记录整个对象)。 这是一个bug还是禁止有这样的连接? toString methodz中没有错误。我敢肯定。首先,我们可以在堆栈中,在递归调用之间没有任何中间,其他hibernate。toSt

  • 我想在(您可以将其视为Student)实体和实体之间实现一个@ManyTomany单向的。很简单,一个教室可以有很多学生,而学生可以有很多教室。我希望它是单向的,因为我希望班级只知道它包含什么学生,学生不必知道他们有什么班级。这就是我目前所拥有的: ClassRoom.java Account.java 我通过以下代码保存它(使用Spring JPA): 但我得到了以下错误: 下面是StackTr

  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

  • 我正在尝试链接mysql表(role、user、user_role)。 UserModel实体包含字段“roles”。 当我保存用户时,表'roles'中会自动创建新行。如何取消重复角色?