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

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

郗奇玮
2023-03-14

我有以下规范,用于查询绑定到某些ManagedApplication实体的任何Contact实体。我传入一个集合 ,该集合包含我正在搜索的ManagedApplication实体的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);
        }
    }
}
@Repository
public interface PagingAndSortingContactRepository extends PagingAndSortingRepository<Contact, Long>, JpaSpecificationExecutor<Contact> {    
}
final Page<Contact> contacts = pagingAndSortingContactRepository.findAll(ContactSpecification.findByApp(appIds), pageable);

因此,我需要知道的是,如何才能使用此规范从查询返回的唯一contact实体?

我知道CriteriaQuery有一个.distinct()方法,您可以将布尔值传递给它,但是我没有在我的规范TopRedicate()方法中使用CriteriaQuery实例。

以下是我的元模型的相关部分。

@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;
}
@StaticMetamodel(ManagedApplication.class)
public class ManagedApplication_ {
    public static volatile SingularAttribute<ManagedApplication, Integer> managedApplicationId;
}

共有1个答案

栾越
2023-03-14

topredicate方法中使用query参数调用distinct方法。

以下示例:

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的ID 。 我将此规范传递给我的方法,以检索一个包含所有符合搜索条件的实体的。 这是。 这就是我调用该方法的方式。 这可以正常工作并返回与传入ID对应的任何实体相关联的所有实体。但是,由于我要将该实体与该实体联接,因此如果一个应用ID列表中有多个实体,则查询将返回重复的实体。 因此,我需要知道的是,如何仅使用this

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

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

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

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

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