1

Person というエンティティを作成しました。Lifecycle インターフェイスを実装します。onLoad メソッドは、部門のプロパティを設定します。部門が不明な場合があります (== null)。

@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 は部門を見つける前に実行されるため、プロパティ「部門」を解決できませんでした。

UserType の 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);
    }
}
4

1 に答える 1

1

@Formula注釈を使用して、仮想列の内容を SQL 式として表現できれば可能です。詳細については、ドキュメントを参照してください。仮想列が仮想結合列である場合は、@JoinFormula注釈も使用できます。

于 2012-07-25T08:04:01.660 に答える