JPA Criteria API并使用包含.in()]的WHERE谓词进行查询。

问题描述 投票:0回答:1
我想在我的谓词是这样的地方进行一些查询:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); CriteriaQuery<ProviderService> criteriaQuery = criteriaBuilder.createQuery(ProviderService.class); // FROM Root<ProviderService> providerService = criteriaQuery.from(ProviderService.class); // SELECT criteriaQuery.select(providerService); // WHERE'S PREDICATE List<Predicate> predicates = new ArrayList<>(); if(providers != null && providers.size() > 0) { predicates.add(providerService.get(ProviderService_.provider).in(providers)); } criteriaQuery.where(predicates.toArray(new Predicate[] { })); TypedQuery<ProviderService> query = getEntityManager().createQuery(criteriaQuery); return query.getResultList();

我检查搜索任何提供者的提供者表单集合(列表)提供的提供者提供(ProviderService)。 

我收到了类似这样的异常:

Caused by: java.lang.IllegalArgumentException: Unaware how to convert value [pl.salonea.entities.Provider@85eab3b6 : pl.salonea.entities.Provider] to requested type [java.lang.Long] at org.hibernate.jpa.criteria.ValueHandlerFactory.unknownConversion(ValueHandlerFactory.java:258) at org.hibernate.jpa.criteria.ValueHandlerFactory.access$000(ValueHandlerFactory.java:34) at org.hibernate.jpa.criteria.ValueHandlerFactory$LongValueHandler.convert(ValueHandlerFactory.java:152) at org.hibernate.jpa.criteria.ValueHandlerFactory$LongValueHandler.convert(ValueHandlerFactory.java:139) at org.hibernate.jpa.criteria.predicate.InPredicate.<init>(InPredicate.java:130) at org.hibernate.jpa.criteria.predicate.InPredicate.<init>(InPredicate.java:108) at org.hibernate.jpa.criteria.CriteriaBuilderImpl.in(CriteriaBuilderImpl.java:529) at org.hibernate.jpa.criteria.expression.ExpressionImpl.in(ExpressionImpl.java:79)

编辑:

我认为它可能与由(Provider,Service)组成并定义如下的ProviderService复合ID有关:

@Id @NotNull @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "provider_id", referencedColumnName = "provider_id", nullable = false, columnDefinition = "BIGINT UNSIGNED") public Provider getProvider() { return provider; } public void setProvider(Provider provider) { this.provider = provider; } @Id @NotNull @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "service_id", referencedColumnName = "service_id", nullable = false, columnDefinition = "INT UNSIGNED") public Service getService() { return service; } public void setService(Service service) { this.service = service; }

并具有适当的IdClass如下:

public class ProviderServiceId implements Serializable { private Long provider; private Integer service; /* constructors */ public ProviderServiceId() { } public ProviderServiceId(Long providerId, Integer serviceId) { this.provider = providerId; this.service = serviceId; } // etc.

或也许没有这样的可能性将实体属性与该属性的可能值列表(实体列表)进行比较

我想在我的谓词像这样的地方进行一些查询:CriteriaBuildercriteriaBuilder = getEntityManager()。getCriteriaBuilder(); CriteriaQuery

条件查询= ...

jpa criteria-api where-in
1个回答
0
投票
建议加入似乎正常工作:
© www.soinside.com 2019 - 2024. All rights reserved.