У меня проблема с синтаксисом с jdo fitler.add - PullRequest
0 голосов
/ 01 февраля 2019

У меня проблема с синтаксисом в добавлении фильтра JDO.Я разместил код ниже.Я очень плохо знаком с JDO и пытаюсь перепроектировать свой путь к этому из других рабочих примеров в кодовой базе.

Я пытаюсь получить список объектов достижений по прикрепленному идентификаторук продукту.

Я получаю «Переменная« достижение »не связана и не может быть определена», но я не уверен, как работает синтаксис фильтра.добавить работы в этом случае.

public Resolution list() {
    Filter filter = em.newFilter();
    Identity identity = getIdentity();

    // apply security restrictions
    if (identity.getSelectedSchoolId() != null){
        Long school = params().getLong("school.id");
        if (school != null){
            filter.add(":allowed.contains(id) || schoolId == :school");
            filter.set("allowed", getSchoolAccess(school).getAchievements());
            filter.set("school", identity.getSelectedSchoolId());
        }else{
            filter.add(":allowed.contains(id) || :schools.contains(schoolId)");
            filter.set("allowed", getUserAccess().getAchievements());
            filter.set("schools", getUserAccess().getSchools());
        }
    }else{
        filter.add("schoolId == null");
    }

    Long categoryId = params().getLong("filter.category");
    if ( categoryId != null && categoryId != 0 ){
        Category filterCategory = params().getEntity("filter.category", Category.class);
        List<Category> categories = categoryManager.getTree(filterCategory);
        List<Long> ids = new ArrayList<>();

        for (Category cat : categories){
            ids.add(cat.getId());
        }

        filter.add(":categories.contains(category.id)");
        filter.set("categories", ids);
    }

    // filter by product
    Long productId = params().getLong("filter.product");
    if (productId != null && productId != 0 ){
          Product product = em.get(Product.class, productId);
         List<Achievement> achievements = product.getAchievements();
         System.out.println(achievements);
         List<Long> ids = new ArrayList<>();
         for (Achievement ach : achievements){
                ids.add(ach.getId());
            }
         filter.add(":achievements.contains(achievement.id)");
            filter.set("achievements", ids);     
      }


    Query q = em.newQuery(Achievement.class);
    q.setFilter(filter.toString());
    q.setOrdering("category.key,name");

    // prepare paging 
    Integer limit = params().getInt("limit");
    Integer start = params().getInt("start");

    if ( start == null )
        start = 0;

    if (limit != null)
        q.setRange(start, limit);

    try {
        em.with(Achievement.class, "image", "category");
        List<Achievement> list = (List<Achievement>) q.executeWithMap(filter.args());
        stash().put("list", list);

        mapper().filter(Achievement.class).add("image", "category");
        return json();
    } finally {
        q.closeAll();
    }
}
...