0

私はパッケージを使用しており、クラスorg.appfuse.dao.hibernate内のすべてのメソッドを使用しました。GenericDaoHibernate<T,PK>

これらの方法を見つけました

public List<T> getAll();
public List<T> getAllDistinct();
public List<T> search(String searchTerm);
public T get(PK id);
public boolean exists(PK id);
public T save(T object);
public void remove(T object);
public void remove(PK id);
public List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams);
public void reindex();
public void reindexAll(boolean async);

モデルクラス、サービス、およびメソッドがいくつかあります。

ここで、id 以外のモデル クラスの他のフィールドを使用してオブジェクトのリストを取得したいと考えています (多くのモデル クラスに共通のフィールドがいくつかあります)。すべてのサービスとダオスで同様のメソッドを記述する必要があります。だから私は、一般的なdaoで共通のメソッドを作成することは可能だと考えていました.

以下、試してみましたがだめでした。

public T getbyClientKey(Long clientkey) {
        Session sess = getSession();
        IdentifierLoadAccess byId = sess.byId(persistentClass);
        List<T> entity = (List<T>) byId.load(clientkey);

        if (entity == null) {
            log.warn("Uh oh, '" + this.persistentClass + "' object with client '" + clientkey + "' not found...");
            throw new ObjectRetrievalFailureException(this.persistentClass, clientkey);
        }

        return entity;
    }

これがエラーになることはわかっていました。の戻り値の型はオブジェクトのみであり、Listではないため、 TypeCastingExceptionが表示されました。byId.load(id)

では、どうすればそのようなメソッドを作成できますか? もしそうなら、私はremove()のメソッドも作成できると思います(しかし、それは今は必要ありません。将来的には必要になるかもしれません)。

4

1 に答える 1

1

Javadoc forIdentifierLoadAccessloadは、メソッドがどのように動作するかについて非常に明確です。

指定された識別子を持つ永続インスタンスを返します。そのような永続インスタンスがない場合は null を返します。

これは、複数のオブジェクトではなく、1 つのオブジェクトのみを返す必要があることを意味しListます。T代わりにキャストしてみてください。

エンティティにクエリを実行する (つまり、主キー以外の方法でアイテムを取得する) 場合は、search(String)メソッドを実装する必要があります。

エンティティにクエリを実行する (つまり、主キー以外の方法で項目を取得する) 場合は、UserDaoHibernateAppFuse に同梱されている を参照してください。loadUserByUsername()次のように実装されるメソッドが含まれています。

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    List users = getSession().createCriteria(User.class).add(Restrictions.eq("username", username)).list();
    if (users == null || users.isEmpty()) {
        throw new UsernameNotFoundException("user '" + username + "' not found...");
    } else {
        return (UserDetails) users.get(0);
    }
}

明らかに、すべてのアイテムを返したい場合は、少し変更する必要があります (これは構成されています)。

public List<UserDetails> loadLockedUsers() {
    List<UserDetails> users = (List<UserDetails>) getSession().createCriteria(User.class).add(Restrictions.eq("account_locked", true)).list();
    return users;
}
于 2013-07-17T07:15:48.867 に答える