Java 使用Hibernate公式批注加载引用

Java 使用Hibernate公式批注加载引用,java,hibernate,Java,Hibernate,我有3个实体-存储、项目和关系。存储有多个项目实体,项目由关系实体绑定。关系可以绑定来自不同存储的项目。为了简化,假设我想通过查询加载关系,并希望快速加载。现在我有3个查询-加载存储、加载存储下的所有项和加载关系列表关系字段 现在我想告诉hibernate如何加载集合导出字段。我尝试了@Formula、@CalculatedColumn和@ManyToMany和@JoinFormula的不同组合。但生成的查询错误或忽略了我的查询。我也不能使用@OneToMany,因为有bug 最新的例外情况是:

我有3个实体-存储、项目和关系。存储有多个项目实体,项目由关系实体绑定。关系可以绑定来自不同存储的项目。为了简化,假设我想通过查询加载关系,并希望快速加载。现在我有3个查询-加载存储、加载存储下的所有项和加载关系列表关系字段

现在我想告诉hibernate如何加载集合导出字段。我尝试了@Formula、@CalculatedColumn和@ManyToMany和@JoinFormula的不同组合。但生成的查询错误或忽略了我的查询。我也不能使用@OneToMany,因为有bug

最新的例外情况是:

原因:org.h2.jdbc.jdbcsql异常:表 未找到测试存储测试关系;SQL语句:

我的实体:

@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;
}