【问题标题】:Hibernate Criteria Subquery HibernateException: Unknown entity: nullHibernate Criteria Subquery HibernateException: Unknown entity: null
【发布时间】:2016-04-17 20:26:41
【问题描述】:

范围是获取由userId 创建的所有Bid 元素,并且是Project projectId AND 的一部分,其中存在Decision,在该BidVerb.verb 字符串是 "accepted"

但是,我得到了一个

org.hibernate.HibernateException: Unknown entity: null

尝试将其实现为以下一对查询和子查询时出现异常:

DetachedCriteria accepedBidIds = DetachedCriteria.forClass(DecisionOnBid.class, "dec")
        .createAlias("dec.bid", "dec_bid")
        .add(Restrictions.eq("verb.verb", "accepted"))
        .setProjection(Projections.property("dec_bid.id"));

Criteria query = sessionFactory.getCurrentSession().createCriteria(Bid.class).createAlias("cbtion.project","proj");
query.add(Restrictions.and(
        Restrictions.like("creator.id", userId),
        Restrictions.like("proj.id", projectId),
        Subqueries.eq("id", accepedBidIds)));

List<Bid> bids = (List<Bid>) query.list();

这些是我的实体。我故意避免双向依赖。

@Entity
@Table( name = "bids" )
public class Bid {

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    private int id;
    @ManyToOne
    private Cbtion cbtion = new Cbtion();
    @ManyToOne
    private User creator = new User();

    ...
}


@Entity
@Table( name = "cbtions" )
public class Cbtion {

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    private int id;
    @ManyToOne
    private Project project;
    @ManyToOne

    ...
}

@Entity
@Table( name = "decisions_on_bids" )
public class DecisionOnBid extends Decision {

    @ManyToOne
    private Verb verb;
    @OneToOne
    private Bid bid;

    ...
}

我尝试了一些别名组合,但找不到正确的组合。有什么建议吗?

【问题讨论】:

    标签: hibernate subquery detachedcriteria


    【解决方案1】:

    这最终对我有用:

    DetachedCriteria accepedBidIds = DetachedCriteria.forClass(DecisionOnBid.class, "d")
            .createAlias("d.verb", "d_v")
            .add(Restrictions.eq("d_v.verb", "accept"))
            .createAlias("d.bid", "d_b")
            .setProjection(Projections.property("d_b.id"));
    
    Criteria query = sessionFactory.getCurrentSession().createCriteria(Bid.class,"b")       
            .add(Restrictions.eq("creator.id", userId))
            .createAlias("b.cbtion","b_c")
            .createAlias("b_c.project","b_c_p")
            .add(Restrictions.eq("b_c_p.id", projectId))
            .add(Subqueries.propertyIn("b.id", accepedBidIds));
    
    @SuppressWarnings("unchecked")
    List<Bid> bids = (List<Bid>) query.list();
    

    并非所有更改都需要。我认为关键是使用了很多别名,特别是createCriteria(Bid.class,"b") 一开始我并不清楚。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多