在Hibernate上加入查询以查询任何类型的映射

时间:2019-03-09 07:38:55

标签: java spring hibernate jpa jpql

我已经实现了与Asset,Patient,Staff的任何关系Tag实体映射

我尝试了以下JPQL查询

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

我遇到以下错误

  

org.hibernate.hql.internal.ast.QuerySyntaxException:无法将AnyType属性加入获取错误

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

代码:

 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
  }

1 个答案:

答案 0 :(得分:0)

我找不到明确禁止的位置(因此也许其他人可以提供更好的答案?),但是documentation警告说,无法为这种类型的关系创建一个外键,并且渴望加入会非常复杂。 Hibernate很可能不支持join fetch的{​​{1}},并且稍后会读取带有单独选择的关系。如果是这样,您可以使用@Any一次读取许多关系,从而避免了N + 1问题。