Java 使用Hibernate公式批注加载引用
我有3个实体-存储、项目和关系。存储有多个项目实体,项目由关系实体绑定。关系可以绑定来自不同存储的项目。为了简化,假设我想通过查询加载关系,并希望快速加载。现在我有3个查询-加载存储、加载存储下的所有项和加载关系列表关系字段 现在我想告诉hibernate如何加载集合导出字段。我尝试了@Formula、@CalculatedColumn和@ManyToMany和@JoinFormula的不同组合。但生成的查询错误或忽略了我的查询。我也不能使用@OneToMany,因为有bug 最新的例外情况是: 原因:org.h2.jdbc.jdbcsql异常:表 未找到测试存储测试关系;SQL语句: 我的实体:Java 使用Hibernate公式批注加载引用,java,hibernate,Java,Hibernate,我有3个实体-存储、项目和关系。存储有多个项目实体,项目由关系实体绑定。关系可以绑定来自不同存储的项目。为了简化,假设我想通过查询加载关系,并希望快速加载。现在我有3个查询-加载存储、加载存储下的所有项和加载关系列表关系字段 现在我想告诉hibernate如何加载集合导出字段。我尝试了@Formula、@CalculatedColumn和@ManyToMany和@JoinFormula的不同组合。但生成的查询错误或忽略了我的查询。我也不能使用@OneToMany,因为有bug 最新的例外情况是:
@Entity
@Table(name = "test_storages")
public class Storage {
@Id
@Column(name = "storage_id")
private BigInteger storageId;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, targetEntity = Item.class)
@JoinColumn(name = "storage_id", updatable = false)
@MapKey
private List<Item> items;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, targetEntity = Relation.class)
@JoinColumn(name = "storage_id", updatable = false)
@Fetch(org.hibernate.annotations.FetchMode.SELECT)
private List<Relation> relations;
@ManyToMany()
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(formula =
@JoinFormula(
value = "(select dep.from_item_id, dep.to_item_id from test_relations dep where dep.storage_id = ?)"
)
)
})
private Collection<Relation> extRelation;
}
@Entity
@Table(name = "test_items")
public class Item {
@Id
@Column(name = "item_id")
private BigInteger itemId;
private String name;
@Column(name = "storage_id")
private BigInteger storageId;
}
@Entity
@Table(name = "test_relations")
public class Relation {
@Column(name = "relation_id")
private BigInteger relationId;
@Column(name = "storage_id")
private BigInteger storageId;
@EmbeddedId
private RelationPK pk;
}
@Embeddable
public class RelationPK implements Serializable {
@Column(name = "from_item_id")
private BigInteger fromItemId;
@Column(name = "to_item_id")
private BigInteger toItemId;
}
上的所有可用源等待,您的查询不应该返回与@OneToMany列表关系相同的结果吗?那么为什么要使用自定义查询呢?@Roman是的。但只是举个例子。将来,我只想加载从一个存储指向另一个存储的关系。
@Entity
@Table(name = "test_storages")
public class Storage {
@Id
@Column(name = "storage_id")
private BigInteger storageId;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, targetEntity = Item.class)
@JoinColumn(name = "storage_id", updatable = false)
@MapKey
private List<Item> items;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, targetEntity = Relation.class)
@JoinColumn(name = "storage_id", updatable = false)
@Fetch(org.hibernate.annotations.FetchMode.SELECT)
private List<Relation> relations;
@ManyToMany()
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(formula =
@JoinFormula(
value = "(select dep.from_item_id, dep.to_item_id from test_relations dep where dep.storage_id = ?)"
)
)
})
private Collection<Relation> extRelation;
}
@Entity
@Table(name = "test_items")
public class Item {
@Id
@Column(name = "item_id")
private BigInteger itemId;
private String name;
@Column(name = "storage_id")
private BigInteger storageId;
}
@Entity
@Table(name = "test_relations")
public class Relation {
@Column(name = "relation_id")
private BigInteger relationId;
@Column(name = "storage_id")
private BigInteger storageId;
@EmbeddedId
private RelationPK pk;
}
@Embeddable
public class RelationPK implements Serializable {
@Column(name = "from_item_id")
private BigInteger fromItemId;
@Column(name = "to_item_id")
private BigInteger toItemId;
}