我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()
可以向其传递布尔值的方法,但是我没有CriteriaQuery
在toPredicate()
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;
}
query
在toPredicate
方法中使用参数来调用不同的方法。
示例如下:
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 时