gpt4 book ai didi

java - 使用 join 的 Spring Data JPA 规范的不同结果

转载 作者:太空狗 更新时间:2023-10-29 22:37:04 26 4
gpt4 key购买 nike

我有以下 Specification我用来查询任何 Contact与某些 ManagedApplication 相关的实体实体。我传入一个 Collection<Long>包含 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);
}
}
}

我将此规范传递给 .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);

这有效并返回所有 Contact与任何 ManagedApplication 相关的实体对应于传入的 id 的实体。但是,因为我正在调用 .join()加入Contact实体与 ManagedApplication实体,如果一个Contact有多个ManagedApplication应用 ID 列表中的实体,则查询将返回重复的 Contact实体。

所以我需要知道的是,我怎样才能只得到不同的 Contact使用此 Specification 从我的查询返回的实体?

我知道CriteriaQuery有一个 .distinct()您可以将 boolean 值传递给的方法,但我没有使用 CriteriaQuery toPredicate() 中的实例我的方法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;
}

最佳答案

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

示例如下:

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);
...

关于java - 使用 join 的 Spring Data JPA 规范的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025213/

26 4 0
文章推荐: java - hibernate :创建索引
文章推荐: c# - ASP.Net MVC 4 w/AttributeRouting 和多个 RoutePrefix 属性
文章推荐: c# - 存储库、删除对象、模型与 ID
文章推荐: c# - 异步 lambda 并且不能将 Task.Task.List 隐式转换为 List