6

他のエンティティへの参照のリストを含むフィールドを持つエンティティがあります(常に4)。いくつかのエンティティを取得し、それらをjspにディスパッチして表示しようとしています。フィールド内のすべての参照もロードし、jspでそれらにアクセスする必要があります。

これが私の基本的な構造です:

@Entity
public class Question {
    @Id Long id;
    @Index String question;
    @Load List<Ref<Answer>> answers = new ArrayList<Ref<Answer>>();
}

このような質問を取得しているとき、明らかにjspにエラーがあります。回答フィールドは回答のリストではなく、参照のリストであるため、理にかなっています。

ObjectifyService.register(Question.class);
ObjectifyService.register(Answer.class);

List<Question> questions = ofy().load().type(Question.class).limit(50).list();

req.setAttribute("questions", questions);
try { 
    getServletContext().getRequestDispatcher("/admin/view-questions.jsp").forward(req, resp); 
} catch (ServletException e) {
    System.out.println (e.getMessage());
}

では、jspの回答にどのようにアクセスしますか?質問を手動でループし、回答フィールドに対してget()を実行する唯一の方法はありますか?

4

3 に答える 3

8

あなたはこれが便利だと思うかもしれません:

public class Deref {
    public static class Func<T> implements Function<Ref<T>, T> {
        public static Func<Object> INSTANCE = new Func<Object>();

        @Override
        public T apply(Ref<T> ref) {
            return deref(ref);
        }
    }

    public static <T> T deref(Ref<T> ref) {
        return ref == null ? null : ref.get();
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> List<T> deref(List<Ref<T>> reflist) {
        return Lists.transform(reflist, (Func)Func.INSTANCE);
    }
}

これを使用して、次のようなメソッドを提供できます。

@Entity
public class Question {
    @Id Long id;
    @Index String question;
    @Load List<Ref<Answer>> answers = new ArrayList<Ref<Answer>>();
    public List<Answer> getAnswers() { return Deref.deref(answers); }
}

注意点の1つは、読み取り専用リストであるということです。少しの創造性で書き込み可能なリストを作成できますが、ReversibleFunctionと新しいList.transform()メソッドを作成する必要があります。JSPに単純なものが必要な場合は、それについて心配する必要はありません。

または、ほとんどの式言語でRefの「value」プロパティを使用できます。

于 2012-11-12T17:20:32.240 に答える