2016-04-17 7 views
0

をスコープはuserIdによって作成され、ProjectprojectIdの一部であるされているすべてのBidの要素を取得することであり、Verb.verbのためにそのBidに、Decisionが存在しているため文字列は"accepted"です。さらに別のHibernateの基準が不明なエンティティサブクエリ: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(); 

これらは私の実体である:クエリとサブクエリの次のペアとしてそれを実装しようとしたときに

しかし、私は

org.hibernate.HibernateException: Unknown entity: null 

例外を取得しています。私は意図的に双方向の依存関係を避けています。

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

    ... 
} 

私はエイリアスのいくつかの組み合わせを試してきましたが、正しいものは得られません。なにか提案を?

答えて

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")は当初私には分かりませんでした。

関連する問題