当前位置: 首页 > 面试题库 >

JpaSpecificationExecutor规范中的JOIN + ORDER BY

井浩思
2023-03-14
问题内容

我有一个使用JOIN和ORDER BY的查询,并想使用Criteria Api在我的存储库中使用它。

在这里,我发现了如何将这样的查询包装到CriteriaQuery(Link)中。

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = cq.join(Pet_.owners);
cq.select(pet);
cq.orderBy(cb.asc(owner.get(Owner_.lastName),owner.get(Owner_.firstName)));

另一方面,我发现了一些将Criteria
Api与JpaRepository结合使用的示例(example)。

问题在于存储库中的所有方法都需要规范:

T findOne(Specification<T> spec);

总是这样构建的:

public static Specification<PerfTest> statusSetEqual(final Status... statuses) {
    return new Specification<PerfTest>() {
        @Override

        public Predicate toPredicate(Root<PerfTest> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            return cb.not(root.get("status").in((Object[]) statuses));
        }
    };

}

因此,一方面,我知道如何创建CriteriaQuery;另一方面,我需要从谓词构建的规范,而我不知道如何将CriteriaQuery解析为规范/谓词。


问题答案:

尝试这样的事情(我假设宠物有很多主人):

public static Specification<Pet> ownerNameEqual(String ownerName) {
        return new Specification<Pet>() {
            @Override
            public Predicate toPredicate(Root<Pet> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Join<Pet, Owner> owners = root.join("owners");
                criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
                return criteriaBuilder.equal(owners.get("name"), ownerName);
            }
        };
    }

这只是搜索至少一个拥有者名称等于 ownerName的 所有宠物的示例 __

但是您可以List<Pet> findByOwnersNameOrderByIdDesc(String ownerName);改为在存储库中添加一个方法(等同于Specification)。



 类似资料:
  • 我正在使用创建自定义查询。如何为以下SQL创建规范? Java类:

  • 无法对JpaSpecificationExecutor存储库使用findAll(规范,分页)方法。我将存储库接口设置为: 每当我调用EmployeeRepository.findall(规范,分页)时;抛出此错误: 这是StackTrace: 完整代码:https://github.com/sanketkd/specificationexecutor 存储库:

  • 问题内容: 任何人都可以帮助我了解什么是mysql中的规范化,在这种情况下以及我们需要如何使用它。 提前致谢。 问题答案: 我试图在这里尝试用外行术语解释标准化。首先,它适用于关系数据库(Oracle,Access,MySQL),因此不仅适用于MySQL。 规范化是要确保每个表都只有最小的字段并摆脱依赖关系。假设您有一个员工记录,而每个员工都属于一个部门。如果将部门与员工的其他数据一起存储为字段,

  • Number,String,Boolean和Object 不要使用如下类型Number,String,Boolean或Object。 这些类型指的是非原始的装盒对象,它们几乎没在JavaScript代码里正确地使用过。 /* 错误 */ function reverse(s: String): String; 应该使用类型number,string,and boolean。 /* OK */ fu

  • 参数规范 参数前带* 表示必填 参数命名采用小写加下划线形式 请求每个接口时,在 header里带上 XX-Token(用户 token),XX-Device-Type(类型:mobile,android,iphone,ipad,web,pc,mac,wxapp),XX-Api-Version(比如1.0.0),XX-Wxapp-AppId(小程序 AppId) 返回结果 参数命名采用小写加下划线

  • 公司及产品名称 我们的公司及产品名称是「DaoCloud」。注意这是两个单词的合成词,所以中间沒有空格(参考:GitHub)。如作为 URL 的一部分,应该使用全小写的「daocloud」。 文案风格 一定多检查,确保没有错别字。 即使是流行语中的谐音错别字也不要使用,比如「墙裂」、「童鞋」等。 我们崇尚精练的文风。请在检查中把对表达意思没有明显作用的字、词、句删除,在不影响表达效果的前提下把文案