【问题标题】:Hibernate criteria: creating alias with entity through another entity with embeddedIdHibernate 标准:通过另一个具有 embeddedId 的实体创建具有实体的别名
【发布时间】:2013-11-25 12:48:13
【问题描述】:

我找不到更好的问题,所以我希望它能说明我在问什么。

我有 3 个实体(我只会编写对更好阅读真正重要的代码

Foo.java

@Data
@Entity
@Table(name = "foo", schema = "pl")
@SequenceGenerator(name = "sequence_generator", sequenceName = "pl.foo_seq", allocationSize = 1)
@EqualsAndHashCode(callSuper = false, exclude = {"Doos" })
@ToString(callSuper = true, exclude = { "Doos" })
    public class Foo extends BaseEntity{
    [...]
    @OneToMany(mappedBy = "pk.foo")
        private Set<FooDooRel> Doos= new HashSet<FooDooRel>();

    public void addDoo(FooDooRel fooDooRel) {
        if (fooDooRel== null) {
            return;
        }

        if (!Doos.contains(fooDooRel)) {
            Doos.add(fooDooRel);
        }

    }
    [...]
    }

FooDooRel.java(具有私有构造函数 FooDooRel())

@Getter
@Setter
@Entity
@Table(name = "foo_doo_rel", schema = "pl")
@EqualsAndHashCode
@ToString(callSuper = true, exclude = { "pk" })
@NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class FooDooRel implements IEntity {
    @EmbeddedId
    private FooDooRelId pk;

    public FooDooRel(Doo doo, Foo foo) {
        if (doo == null || foo == null) {
            throw new IllegalArgumentException("Foo or Doo equals null");
        }
        doo.addFoo(this);
        foo.addDoo(this);
        pk = new FooDooRelId(doo, foo);
    }
    [...]
    }

FooDooRelId.java(具有私有构造函数 FooDooRelId())

@Getter
@Setter
@Embeddable
@EqualsAndHashCode
@ToString(callSuper = true, exclude = { "doo", "foo" })
@NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class FooDooRelId implements Serializable {

        @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
        @JoinColumn(name = "doo_id")
        private Doo doo;

        @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
        @JoinColumn(name = "project_id")
        private Foo foo;

    public FooDooRelId(Doo doo, Foo foo) {
        setDoo(doo);
        setFoo(foo);
    }
    }

Doo.java

@Data
@Entity
@Table(name = "doo", schema = "pl")
@SequenceGenerator(name = "sequence_generator", sequenceName = "pl.doo_seq", allocationSize = 1)
@EqualsAndHashCode(callSuper = false, exclude = {"Foos" })
@ToString(callSuper = true, exclude = { "Foos" })
public class Doo extends BaseEntity{
[...]
@OneToMany(mappedBy = "pk.doo")
    private Set<FooDooRel> Foos= new HashSet<FooDooRel>();
@Column(name = "dispid", nullable = false)
    private String dispid;

public void addFoos(FooDooRel fooDooRel) {
    if (fooDooRel== null) {
        return;
    }

    if (!Foos.contains(fooDooRel)) {
        Foos.add(fooDooRel);
    }

}
[...]
}

现在我必须为我的过滤器创建别名

Criteria criteria = getSession().createCriteria(Foo.java, "foo")
criteria.createAlias("Doos", "Disp5", JoinType.LEFT_OUTER_JOIN, Restrictions.eq(Disp5.pk.foo.dispid", "5"));

现在第一个错误,当我这样做时,我得到了这个错误

无法解析属性:pk.foo.dispid of:pl.FooDooRel

我也试过了

criteria.createAlias("Foos", "fooRel", JoinType.LEFT_OUTER_JOIN).createAlias("fooRel.pk.doo", "doo5",
        JoinType.LEFT_OUTER_JOIN, Restrictions.eq("dispid", "5"));

criteria.createAlias("Foos", "fooRel", JoinType.LEFT_OUTER_JOIN).createAlias("fooRel.pk.doo", "doo5",
        JoinType.LEFT_OUTER_JOIN, Restrictions.eq("doo5.dispid", "5"));

我知道我必须进行第二次 JOIN 才能将 FooDooRel 与 Doo 一起加入,但我不知道该怎么做。我可以为 FooDooRel 创建别名,但如何在相同的条件下更进一步到 Doo。

第二个,当我这样做时,我必须从同一个集合中做 2 个别名

Criteria criteria = getSession().createCriteria(Foo.java, "foo")
criteria.createAlias("Doos", "Disp5", JoinType.LEFT_OUTER_JOIN, Restrictions.eq(Disp5.pk.foo.dispid", "5"));
criteria.createAlias("Doos", "Disp6", JoinType.LEFT_OUTER_JOIN, Restrictions.eq(Disp5.pk.foo.dispid", "6"));

我收到一个错误,该路径重复

首先,如何通过检查 Doo 中的 dispid 将 FooDooRel 加入到 Foo,其次如何从同一路径加入 2 个别名?

我不能使用子查询(DetachedCriteria)。

我不想写很多,但是在我之前的问题中,有人告诉我我的上帝不好,所以我添加了我认为我应该添加的所有内容。这基本上是由@ManyToOne 从“内部”连接的 3 个实体的示例。还有一个实体有embeddableId。我希望您能理解我的实体,我的问题是关于标准,并通过从第三个实体添加标准来为第一个实体创建别名。

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    如果有人仍然想知道这个问题 - 不幸的是,这是 hibernate 中的一个错误,尚未修复。

    【讨论】:

    • 你能分享一个链接吗?
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多