Сортировка с помощью Criteria Builder по встроенному атрибуту - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь получить все объекты Foo, отсортированные по атрибуту времени Embedded Bar. Я определил сущности Foo со встроенной сущностью Bar следующим образом:

public class Foo {
    ...
    @Embedded
    private Bar bar;
    ...
}

@Embeddable
public class Bar {
    ...
    @Column(name = "TIME")
    private Date time;
    ...
}

У меня также есть статические метамодели для использования в моем хранилище для Foo и Bar:

@StaticMetamodel(Foo.class)
public class Foo_{
    ...
    public static volatile SingularAttribute<Foo, String> attribute_;
    public static volatile SingularAttribute<Foo, Bar> bar_;
    ...
}

@StaticMetamodel(Bar.class)
public class Bar_{
    public static volatile SingularAttribute<Bar, Date> time_;
}

Затем в моем репозитории я строю запрос с помощью построителя критериев:

@Repository
public class FooRepositoryImpl implements FooRepository {
    ...
    @Override
    public Page<Foo> findAllWithPagingAndFilter(PageRequest pageRequest, String attribute) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
        Root<Foo> root = criteriaQuery.from(Foo.class);
        Predicate attributePredicate= criteriaBuilder.equal(root.get(Foo.attribute_), attribute);
        criteriaQuery.where(attributePredicate);
        criteriaQuery.orderBy(criteriaBuilder.desc(root.get(Foo_.bar_).get(Bar_.time_)));
        TypedQuery<Comment> typedQuery = entityManager.createQuery(criteriaQuery);
        typedQuery.setFirstResult((pageRequest.getPageNumber()) * pageRequest.getPageSize());
        typedQuery.setMaxResults(pageRequest.getPageSize());
        return new PageImpl<>(typedQuery.getResultList(), pageRequest, genericCountWithPredicates(Foo.class, attributePredicate));
    }
    ...
}

Выполнение вышеуказанного кода приводит к NullPointerException со следующей трассировкой стека:

java.lang.NullPointerException: null
    at org.hibernate.query.criteria.internal.path.AbstractPathImpl.get(AbstractPathImpl.java:123)
    at com.project.server.repositories.impl.FooRepositoryImpl.findAllWithPagingAndFilter(FooRepositoryImpl.java:52)
    at com.project.server.repositories.impl.FooRepositoryImpl$$FastClassBySpringCGLIB$$7a99bbb7.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

FooRepositoryImpl.java: 52 указывает на эту строку:

criteriaQuery.orderBy(criteriaBuilder.desc(root.get(Foo_.bar_).get(Bar_.time_)));

Я не могу понять, почему в моем коде атрибут Foo_.bar_ имеет значение null, что приводит к NPE, не могли бы вы указать мою ошибку?

1 Ответ

0 голосов
/ 04 января 2019

хорошо, я нашел ответ, на самом деле я сделал несколько ошибок:

  • в статической модели должен иметь то же имя, что и атрибут объекта, поэтому в обеих моделях statit мне пришлось удалить _ суффикс
  • , поскольку я встраивал другой класс и использовал Lombok в качестве поставщика конструктора, а у Bar не было необходимого конструктора, поэтому встроенная сущность не инициализировалась во время создания, в результате чего объект класса Foo с атрибутом Bar был нулевым
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...