我有以下Specification
,我用它來查詢與某個ManagedApplication
實體綁定的任何Contact
實體。我傳入一個Collection<Long>
,其中包含我正在搜索的ManagedApplication
實體的ID。Spring Data使用連接的JPA規範的不同結果
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);
}
}
}
我通過本說明書中對我的PagingAndSoringRepository
的.findAll()
方法檢索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);
這個工作並返回所有Contact
實體被綁定到任何ManagedApplication
實體對應於通過IDS的。但是,由於我打電話.join()
與ManagedApplication
實體加盟Contact
實體,如果一個Contact
在應用ID列表中有多個ManagedApplication
實體,則查詢將返回重複的Contact
實體。
所以我需要知道的是,我怎樣才能得到不同的Contact
實體返回從我的查詢使用此Specification
?
我知道CriteriaQuery
有.distinct()
方法,你可以傳遞一個布爾值,但我不會在我的Specification
的toPredicate()
方法使用CriteriaQuery
實例。
以下是我的元模型的相關部分。
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.distinct(true)'到每個需要這個不同語句的謂詞。它不足以將此語句添加到任何謂詞並使其適用於整個查詢。 –