2012-07-25 91 views
1

我創建了一個名爲Person的實體。它實現了生命週期界面。 onLoad方法設置部門屬性。有時候一個部門是未知的(== null)。hibernate - Criteria查詢的虛擬列

@Entity 
@Table(name = "PERSON") 
public class Person implements Lifecycle { 

    @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)") 
    String name; 

    @Transient 
    Department department; 

    public void onLoad(Session s, Serializable id) { 
     // some logic resolving department 
    } 
} 

有什麼辦法可以使部門屬性成爲一個虛擬列(或類似的東西) - 從未在數據庫中創建。

@Entity 
@Table(name = "PERSON") 
public class Person { 

    @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)") 
    String name; 

    @Type(type = "DepartmentType") // UserType for resolving a department 
    //@Transcient 
    //@Column(insertable = false, updatable = false) 
    //@NotFound(action = NotFoundAction.IGNORE) 
    // ... don't have a clue 
    Department department; 
} 

我想有能力使用標準。

Criteria criteria = session.createCriteria(Person.class); 
criteria.add(Restrictions.isNotNull("department")); 
List<Person> list = criteria.list(); 

我知道Criteria在找到部門之前執行,所以屬性'department'無法解析。

我已經看到了,我可以從用戶類型的nullSafeGet

public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { 
    rs.deleteRow(); 
} 

刪除行,但我不想刪除數據庫中的行(它是隻讀的!)。

要總結我的問題是:

1)是否有可能創建一個虛擬列?

2)有沒有更有效的方法來做到這一點?

Criteria criteria = session.createCriteria(Person.class); 
// ... some restrictions ... 
List<Person> list = criteria.list(); 
Iterator<EbamLogMessageEntity> it = list.iterator(); 
while(it.hasNext()) { 
    Person p = it.next(); 
    Department d = resolveDepartment(p) 
    if(d == null) { 
    it.remove(); 
} else { 
     p.setDepartment(d); 
    } 
} 

回答

0

這是可能的,如果你能表達虛擬列的內容作爲SQL配方,採用@Formula註解。有關更多詳細信息,請參閱the documentation。如果虛擬列是虛擬連接列,那麼您也可以使用@JoinFormula annotation

+0

但@Formula表達式只能使用其他屬性,對吧?我不能使用任何自定義代碼? – 2012-07-25 08:19:51

+0

@Formula表達式是一個將在SQL select子句中使用的SQL表達式。如果您可以將其放入SQL select子句中以檢索其他虛擬列,則可以將其放入公式中。 – 2012-07-25 08:45:51

+0

好的,但部門屬性的解決不基於任何數據庫表,因此不可能創建公式。 – 2012-07-26 07:16:10