2013-11-26 50 views
1

好吧,讓我得到這個奇怪的問題,我無法修復。 我有3個實體(我會寫的東西,只有重要的IMO)當使用標準創建別名時,列索引超出範圍

@Data 
@Entity // all @ are in javax 
@Table(name = "a", schema = "pl") 
@SequenceGenerator(...) 
public class A extends BaseEntity { 
@OneToMany(mappedBy = "pk.a") 
    private Set<ABRel> Bs = new HashSet<ABRel>(); 
} 

@Getter 
@Setter 
@Entity 
@Table(name = "a_b_rel", schema = "pl") 
public class ABRel implements IEntity { 
    @EmbeddedId 
    private OfferOrderProjectRelId pk; 

    public OfferOrderProjectRel(B b, A a) { 
     if (a == null || b == null) { 
      throw new IllegalArgumentException("B orA equals null"); 
     } 
     B.addA(this); // this methods just adds ABRel to sets in A and B 
     A.addB(this); 
     pk = new ABRelId(b, a); 
    } 
} 

@Getter 
@Setter 
@Embeddable 
@EqualsAndHashCode 
public class OfferOrderProjectRelId implements Serializable { 

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH }) 
    @JoinColumn(name = "b_id") 
    private B b; 

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH }) 
    @JoinColumn(name = "a_id") 
    private A a; 

    public ABRelId(B b, A a) { 
     setB(b); 
     setA(a); 
    } 
} 

@Data 
@Entity (it has javax import) 
@Table(name = "b", schema = "pl") 
@SequenceGenerator(...) 
public class B extends BaseEntity { 
@OneToMany(mappedBy = "pk.b") 
private Set<ABRel> As = new HashSet<ABRel>(); 

@NotBlank 
@Length(max = 10000) 
@Column(name = "type", length = 10000, nullable = false) 
private String type; 
} 

ABRel和ABRelId有私人構造器(ABRel()ABRelId()),但如果它的問題不知道。實體工作得很好,所以我不認爲他們有什麼錯,但是我錯了。

所以我試着爲我的過濾器添加B.type的標準。標準是「in」(不知道該怎麼說:))A.class。因此,這裏的是我試着在我的DAO添加標準(我可以將它添加到標準不沾邊的,如果有人問):

DetachedCriteria idCriteria = DetachedCriteria.forClass(A.class, "a"); 
idCriteria.createAlias("Bs", "btype", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("Bs.pk.B.type", "someType")); 
Criteria criteria = getSession().createCriteria(A.class, "a"); 
criteria.add(Subqueries.propertyIn("id", idCriteria)); 

什麼我試着做到的,是得到了一些規定,所有ABRels B.ty​​pe,那麼我將不得不數數它,但這不是我的問題atm。我必須使用標準,不能使用任何HQL。我也讀過hibernate有創建別名beetwen實體和它的嵌入式的一些錯誤,所以我不能做到這一點(可能這就是爲什麼我有很多麻煩)。那麼有什麼想法?我沒有選擇,所以任何幫助都會很棒!

我幾乎忘了,我得到這個錯誤

org.hibernate.HibernateException:未知實體:空在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getPropertyMapping(CriteriaQueryTranslator.java:638) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:587) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypeUsingProjection(CriteriaQueryTranslator.java:569) 在 org.hibernate.loader .criteria.CriteriaQueryTranslat or.getTypedValue(CriteriaQueryTranslator.java:627) 在 org.hibernate.criterion.SimpleExpression.getTypedValues(SimpleExpression.java:100) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getQueryParameters(CriteriaQueryTranslator.java:335) 在 org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:151) 在 org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:68)

UPDATE:

我已經加入某事像這樣

criteria.createAlias("As", "oorel", JoinType.LEFT_OUTER_JOIN); 
criteria.createAlias("oorel.pk.b", "order", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("type", "order")); 

而現在我得到新的錯誤(這是我的母語,所以我會盡量把它翻譯)它的Postgres和休眠例外:

列索引超出範圍:1,列數:0

對不起,我的英語不好,並提前謝謝。

回答

0

這是一個尚未修復的休眠錯誤。出現此錯誤是因爲hibernate無法通過包含組合鍵的實體創建別名。