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

使用联接的Spring Data JPA规范的不同结果

伏建修
2023-03-14
问题内容

Specification使用以下查询任何Contact与某些ManagedApplication实体绑定的实体。我传入一个Collection<Long>包含ManagedApplication要搜索的实体ID的ID

public static Specification<Contact> findByApp(final Collection<Long> appIds) {
    return new Specification<Contact>() {
        @Override
        public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {            
            final Predicate appPredicate = root.join(Contact_.managedApplications)
                .get(ManagedApplication_.managedApplicationId).in(appIds);
        }
    }
}

我将此规范传递给.findAll()我的方法,PagingAndSoringRepository以检索一个Page<Contact>包含所有Contact符合搜索条件的实体的。

这是Repository

@Repository
public interface PagingAndSortingContactRepository extends PagingAndSortingRepository<Contact, Long>, JpaSpecificationExecutor<Contact> {    
}

这就是我调用该.findAll()方法的方式。

final Page<Contact> contacts = pagingAndSortingContactRepository.findAll(ContactSpecification.findByApp(appIds), pageable);

这可以正常工作并返回与传入ID对应的Contact任何实体相关联的所有实体ManagedApplication。但是,由于我要.join()将该Contact实体与该ManagedApplication实体联接,因此如果一个应用ID列表中Contact有多个ManagedApplication实体,则查询将返回重复的Contact实体。

因此,我需要知道的是,如何仅Contact使用this从查询中返回不同的实体Specification

我知道CriteriaQuery有一个.distinct()可以向其传递布尔值的方法,但是我没有CriteriaQuerytoPredicate()my方法中使用实例Specification

这是我的元模型的相关部分。

Contact_.java:

@StaticMetamodel(Contact.class)
public class Contact_ {
    public static volatile SingularAttribute<Contact, String> firstNm;
    public static volatile SingularAttribute<Contact, String> lastNm;
    public static volatile SingularAttribute<Contact, String> emailAddress;
    public static volatile SetAttribute<Contact, ManagedApplication> managedApplications;
    public static volatile SetAttribute<Contact, ContactToStructure> contactToStructures;
}

ManagedApplication_.java

@StaticMetamodel(ManagedApplication.class)
public class ManagedApplication_ {
    public static volatile SingularAttribute<ManagedApplication, Integer> managedApplicationId;
}

问题答案:

querytoPredicate方法中使用参数来调用不同的方法。

示例如下:

public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {            
    final Predicate appPredicate = root.join(Contact_.managedApplications)
        .get(ManagedApplication_.managedApplicationId).in(appIds);
    query.distinct(true);
    ...


 类似资料:
  • 我有以下,用于查询绑定到某些实体的任何实体。我传入一个,该集合包含我正在搜索的实体的ID。 因此,我需要知道的是,如何才能使用此从查询返回的唯一实体? 我知道有一个方法,您可以将布尔值传递给它,但是我没有在我的的方法中使用实例。 以下是我的元模型的相关部分。

  • 有没有人知道Java10和JVM10规范的版本与以前的版本不同?对于Java8和Java9,有不同的规范,很难看到有什么变化。

  • 什么是SQL和什么是不同的类型?

  • 支持项 后端数据库为 MySQL、Oracle、PostgreSQL、SQLServer; 用户需要对数据库表中某个或多个列进行加密(数据加密 & 解密); 兼容所有常用SQL。 不支持项 用户需要自行处理数据库中原始的存量数据、洗数; 使用加密功能+分库分表功能,部分特殊SQL不支持,请参考SQL使用规范; 加密字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE等;

  • 支持项 将外围数据迁移至 Apache ShardingSphere 所管理的数据库; 将 Apache ShardingSphere 的数据节点进行扩容或缩容。 不支持项 不支持无主键表的扩容和缩容。

  • 支持项 提供一主多从的读写分离配置,可独立使用,也可配合分库分表使用; 独立使用读写分离支持SQL透传; 基于Hint的强制主库路由。 不支持项 主库和从库的数据同步; 主库和从库的数据同步延迟导致的数据不一致; 主库双写或多写; 跨主库和从库之间的事务的数据不一致。主从模型中,事务中读写均用主库。 可选项 配置项 详细说明 默认值 适用范围 queryConsistent 该配置为 true 时