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

Spring Data JPA存储库,具有规范、分页和标准fetch-join

谭曦
2023-03-14
@Entity
@Table(name = "delegations")
public class Delegation {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @ManyToOne
    private Customer customer;

    // more fields, getters, setters, business logic...

}
@Entity
@Table(name = "customers")
public class Customer {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    // more fields, getters, setters, business logic...
}

DTO筛选器类:

public class DelegationFilter {

    private String customerName;

    // more filters, getters, setters...
}

和搜索/筛选服务:

public class DelegationService {
    public Page<Delegation> findAll(DelegationFilter filter, Pageable page) {
        Specifications<Delegation> spec = Specifications.where(
                customerLike(filter.getCustomerName())
        );
        return delegationRepository.findAll(spec, page);
    }

    public List<Delegation> findAll(DelegationFilter filter) {
        Specifications<Delegation> spec = Specifications.where(
                customerLike(filter.getCustomerName())
        );
        return delegationRepository.findAll(spec);
    }

    private Specification<Delegation> customerLike(String customerName) {
        return (root, query, cb) -> {
            Join<Delegation,Customer> join = (Join) root.fetch(Delegation_.customer);
            return cb.like(cb.lower(join.get(Customer_.name)), addWildCards(customerName.toLowerCase()));
        };
    }

    private static String addWildCards(String param) {
        return '%' + param + '%';
    }
}

问题:

org.springframework.dao.InvalidDataAccessApiUsageException: 
org.hibernate.QueryException: query specified join fetching, but the owner 
of the fetched association was not present in the select list

我使用的是Spring Boot 1.4(Spring 4.3.2,spring-data-jpa 1.10.2)和Hibernate 5.0.9

共有1个答案

相温文
2023-03-14

我也面临着同样的问题,我找到了一个解决办法(来源)。

您可以在运行时检查查询的返回类型,这样,如果它是long(计数查询返回的类型),则联接,否则获取。在您的代码中,它将如下所示:

...
private Specification<Delegation> customerLike(String customerName) {
    return (root, query, cb) -> {
        if (query.getResultType() != Long.class && query.getResultType() != long.class) {
          Join<Delegation,Customer> join = (Join) root.fetch(Delegation_.customer);
        } else {
          Join<Delegation,Customer> join = root.join(Delegation_.customer);
        }
        return cb.like(cb.lower(join.get(Customer_.name)), addWildCards(customerName.toLowerCase()));
    };
}
...

我知道这不是很干净,但这是我唯一的解决办法。

 类似资料:
  • PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。

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

  • 我已经实现了一个小用例来评估Spring Data Neo4j。我有一个接口,它扩展了GraphRepository。 界面是这样的: 这给了我错误< code >“类型PublicRepository的层次结构不一致”。 这种类型的错误是因为当前类扩展/实现的类/接口之一不存在,而当前类又在扩展/实现另一个类/接口。 查看核心库的包我发现库中没有扩展为CRUDRepository的接口。我在Ne

  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一