我已经实现了与 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 很可能不支持 @Any
的 join fetch
,而是稍后使用单独的选择来读取关系。如果是这样,您可以使用 @BatchSize
通过一次选择读取多个关系,避免 N+1 问题。
关于java - Hibernate 上任意类型映射的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55075116/