【问题标题】:Join query for any type mapping on Hibernate在 Hibernate 上加入任何类型映射的查询
【发布时间】:2019-07-31 04:31:39
【问题描述】:

我已经实现了与 Asset、Patient、Staff 的任何关系标签实体映射

我在JPQL Query下面试过

em.createQuery("select t from Tag t join t.tagAssociation ta");

我收到以下错误

org.hibernate.hql.internal.ast.QuerySyntaxException: An AnyType attribute cannot be join fetched error

查询有什么问题? 如何编写连接查询,我想获取资产和标签关联列表。

代码:

 public interface ITagAssociatable {
 public String getName();   
}

 @Entity
 public class Tag {
 @Id
 private String tagSerialNumber;    

@JsonIgnore
@Any(metaColumn = @Column(name = "tag_association_type"))
@AnyMetaDef(idType = "long", metaType = "string", metaValues = {
        @MetaValue(targetEntity = Asset.class, value = "Asset"),
        @MetaValue(targetEntity = Staff .class, value = "Staff"),
        @MetaValue(targetEntity = Patient.class, value = "Patient") })
@Cascade({ org.hibernate.annotations.CascadeType.MERGE })
@JoinColumn(name = "tag_association_id")
private ITagAssociatable tagAssociation;
 }

    @Entity
    public class Asset implements ITagAssociatable {
@Id
private Long id;
private String name
  }

    @Entity
    public class Staff implements ITagAssociatable {
@Id
private Long id;
private String name;
  }

    @Entity
    public class Patient implements ITagAssociatable{
@Id
private Long id;
private String name
  }

【问题讨论】:

  • 如果您输入:em.createQuery("select t from Tag t join t.tagAssociation ta", Tag.class);,会发生什么?

标签: java spring hibernate jpa jpql


【解决方案1】:

我找不到特别禁止的地方(所以也许其他人可以提供更好的答案?),但documentation 警告说不可能为这种类型的关系创建外键,并且急切的加入会相当复杂。 Hibernate 很可能不支持 join fetch@Any 并且稍后将使用单独的选择来读取关系。如果是这样,您可以使用@BatchSize 一键读取多个关系,避免 N+1 问题。

【讨论】:

  • 还是不能查询的情况?我正在检查是否有任何其他解决方案,如子查询或 HQL 构造函数。一些好的提示?在我的情况下,即使使用 @BatchSize 减轻了额外的查询也不好。谢谢
  • 好吧,警告仍然保留在最新版本中 (docs.jboss.org/hibernate/orm/current/userguide/html_single/…),所以我假设是这样。我想如果你真的必须用一个选择来做的话,你可以求助于原生 SQL 查询。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多