当前位置: 首页 > 知识库问答 >
问题:

使用Criteria Builder按嵌入属性排序

符功
2023-03-14

我正在尝试获取按嵌入条的时间属性排序的Foo的所有实体。我已经定义了实体Foo,其中嵌入了实体栏,如下所示:

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_;
}

然后在我的存储库中,我将使用criteria builder构建一个查询:

@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)

java:52指向这一行:

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

我不明白为什么在我的代码中Foo_uu.bar_uu属性为null导致NPE,你能指出我的错误吗?

共有1个答案

莫宝
2023-03-14

好的,我找到了答案,实际上我犯了几个错误:

  • 静态模型中的属性应该与实体attribyte具有相同的名称,因此在两个静态模型中,我必须删除_< /code>后缀
  • 由于我正在嵌入其他类,并使用Lombok作为构造函数提供者,因此Bar没有需要的构造函数,因此嵌入式实体在创建时没有初始化,导致类Foo属性Bar的对象为空

 类似资料:
  • 我有一个使用Spring Boot 1.5.1和Spring Data Rest的数据库服务。我将我的实体存储在MySQL数据库中,并使用Spring的PagingAndSorting Repository通过REST访问它们。我发现这表明支持按嵌套参数排序,但我找不到按嵌套字段排序的方法。 我有以下课程: 例如,当使用该方法时: 并调用 URI http://localhost:8080/peo

  • 我正在尝试按地理距离对具有嵌套地理点映射的索引进行排序。 这是我的简化映射: 这里,每个组织可以有几个地点点。 文档: 这是我的查询(PHP数组): 预期结果 : 我希望按geo_point排序资源(检查每个位置,然后检查某个位置是否靠近给定的纬度/经度)

  • 问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持

  • 问题内容: 这是使用PHP生成的json 这样做显然行不通。我在其他文章中读到,需要为这种数据结构创建一个orderBy函数。我无法创建该功能。谁能告诉我解决此问题的正确方法是什么? 问题答案: 这些类型的数据操作我希望将它们保留在适当的角度对象中,因此,我将创建自定义过滤器,如下所示: 重要提示: 我建议您使用自定义过滤器,因为出于个人喜好,我不喜欢在控制器或其他对象上加载我可以在其他对象上分离

  • 问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:

  • 哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。 假设我有一个类型,其属性为。假设我有这些用户的地图 ?