0

JPA を使用してデータベースにアクセスするために、汎用実装で抽象基本クラスを使用します。エンティティ メタ モデルも使用します。

public List<PersonEntity> findByCode(String code) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<PersonEntity> cq = cb.createQuery(PersonEntity.class);
    Root<PersonEntity> root = cq.from(PersonEntity.class);

    Predicate predicate = cb.equal(root.get(PersonEntity_.code), code);
    cq.where(predicate);

    TypedQuery<PersonEntity> query = entityManager.createQuery(cq);
    List<PersonEntity> list = new ArrayList<>();
    return query.getResultList();
}   

この平和なコードは何度も使用されるため、これを汎用基本クラスに移動したいと考えています。「コード」があるかどうかを確認するにはどうすればよいですか?すべてのクラスに 1 つあるわけではありません。

public List<E> findByCode(String code) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<E> cq = cb.createQuery(entityClass);
    Root<E> root = cq.from(entityClass);

    //here is my problem: how to check if there is a "code"?
    // Most classes have one, but not all.
    Predicate predicate = cb.equal(root.get(PersonEntity_.code), code);
    cq.where(predicate);

    TypedQuery<E> query = entityManager.createQuery(cq);
    List<E> list = new ArrayList<>();
    return query.getResultList();
}
4

1 に答える 1

1

おそらくインターフェイスを宣言する必要があります(より良い名前で):

public interface Codeable {
    public String getCode();
}

そして、メソッドを次のように宣言します。

public List<E implements Codeable> findByCode(String code, Class<E> clazz) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<E> cq = cb.createQuery(entityClass);
    Root<E> root = cq.from(entityClass);

    //here is my problem: how to check if there is a "code"?
    // Most classes have one, but not all.
    Predicate predicate = cb.equal(root.get(PersonEntity.getCode()), code);
    cq.where(predicate);

    TypedQuery<E> query = entityManager.createQuery(cq);
    List<E> list = new ArrayList<>();
    return query.getResultList();
}

クラス型のパラメーターに渡しますclazz(コンパイラーがクエリで実際に使用する型と返す型を知るため):

List<PersonEntity> persons = dao.findByCode("someCode", PersonEntity.getClass());

PS

インターフェイスに準拠するために、 も変更し.codeました。.getCode()

于 2014-02-21T16:34:42.403 に答える