java - Hibernate 上任意类型映射的连接查询

标签 java spring hibernate jpa jpql

我已经实现了与 Assets 、患者、员工的任何关系标签实体映射

我尝试了下面的 JPQL 查询

em.createQuery("从Tag t中选择t加入t.tagAssociation ta");

我收到以下错误

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

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

代码:

 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
  }

最佳答案

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

关于java - Hibernate 上任意类型映射的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55075116/

相关文章:

java - 在由 Stream 外部的对象确定的流上返回 min

java - 如何使用 FileProvider 访问下载文件夹?

spring - 尝试添加 spring-data 时缺少 Artifact

java - 特定应用种子数据群

java - Hibernate:一张表,多个实体/持久类,合法吗?

java - 我将如何改变这个嵌套循环?

java - RxJava - 在 groupBy 之后映射不同的函数

java - 如何使用包含列表的构造函数编写 spring bean?

java - 在 Spring 中加载单例 bean 中的错误消息

java - 三层体系中,业务逻辑应该放在哪里?