2013-04-06 56 views
0

我們使用JBoss 7的Hibernate 4.0對Oracle 11G數據庫。 java pojo類具有這兩個屬性(除了其他屬性)。請注意,SalesPerson類有一個SalesPersonId,它是一個持久存儲到SalesOrder表中的組合鍵。Hibernate Criteria使用Oracle 11G的setMaxResults給org.hibernate.exception.SQLGrammarException:ORA-00918:列模糊定義

public class SalesOrder extends OurBaseClass<SalesOrder>{ 
    private SalesPersonId salesPersonId; 
    private SalesPerson salesPerson; 

    @Embedded 
    @AttributeOverride(name = "location", column = @Column(name = "sale_person_loc")) 
    @XmlElement 
    public SalesPersonId getSalesPersonId() { 
     return salesPersonId; 
    } 
    public void setSalesPersonId(SalesPersonId salesPersonId) { 
     this.salesPersonId = salesPersonId; 
    } 
    //The below object contains a SalesPersonId as composite primary key 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ 
    @JoinColumn(name = "sales_person_no", insertable = false, updatable = false), 
    @JoinColumn(name = "sales_person_loc", insertable = false, updatable = false) 
    }) 
    @XmlElement 
    public SalesPerson getSalesPerson() { 
     return salesPerson; 
    } 
    public void setSalesPerson(SalesPerson salesPerson) { 
     this.salesPerson = salesPerson; 
    } 
} 

的休眠標準代碼如下:

Session session = (Session) manager.getDelegate(); 
Criteria criteria = session 
    .createCriteria(SalesOrder.class,"so") 
    .createAlias("salesPerson", "salesperson",JoinType.LEFT_OUTER_JOIN) 
    .setMaxResults(100) 
    .addOrder(Order.asc("id")); 

由休眠生成的SQL是這樣的:

select * from (select this_.sales_person_no as sales_person4_641_2_, 
      this_.sales_person_loc as sales_person5_641_2_, 
      this_.SALES_PERSON_NO as SALES_PERSON4_641_2_ 
      from SALES_ORDER this_, sales_person sales_person2_ 
      where this_.sales_person_no=sales_person2_.sales_person_no(+) and 
      this_.sales_person_loc=sales_person2_.loc(+) 
order by this_.order_no asc) where rownum <= ? 

被返回的錯誤是由於所產生的重複的列名通過休眠。關於這個錯誤有什麼可以做的嗎?我知道如果從pojo中刪除SalesPersonId,我不會收到錯誤,但是,我被告知該類需要SalesPerson和SalesPersonId。我也知道如果我刪除setMaxResults,但我沒有收到錯誤,但這不是一個選項。感謝您的任何幫助。

回答

0

我弄明白了。此問題幫助了我: What does @AttributeOverride mean?

由於某些原因,只有嵌入ID的組合鍵的一個屬性被覆蓋。所以我增加了一個客戶屬性覆蓋到位置覆蓋,並處理了這個問題。