Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过使用CriteriaAPI将子实体的属性列为白名单来选择JPA实体?_Java_Jakarta Ee_Jpa 2.0_Criteria Api_Jpa 2.1 - Fatal编程技术网

Java 如何通过使用CriteriaAPI将子实体的属性列为白名单来选择JPA实体?

Java 如何通过使用CriteriaAPI将子实体的属性列为白名单来选择JPA实体?,java,jakarta-ee,jpa-2.0,criteria-api,jpa-2.1,Java,Jakarta Ee,Jpa 2.0,Criteria Api,Jpa 2.1,我陷入了以下假设问题: 使用标准API而不是JPQL,并给出 一张满是用户的桌子,每个人都有多辆车 @实体 公共类用户{ @身份证 私人长id; @独身癖 私家车; } @实体 公车{ @身份证 私人长id; 私有字符串模型; } 包含以下车型的一套: 设置模型=getThousandsOfModels; 如何选择至少有一辆车型在车型集中的车辆的用户 我已经阅读了很多答案,尝试了不同的方法,最有希望的方法似乎包括创建带表达式的谓词,使用.in等,但没有任何效果。下面的代码成功了: Set<

我陷入了以下假设问题:

使用标准API而不是JPQL,并给出

一张满是用户的桌子,每个人都有多辆车

@实体 公共类用户{ @身份证 私人长id; @独身癖 私家车; } @实体 公车{ @身份证 私人长id; 私有字符串模型; } 包含以下车型的一套:

设置模型=getThousandsOfModels; 如何选择至少有一辆车型在车型集中的车辆的用户


我已经阅读了很多答案,尝试了不同的方法,最有希望的方法似乎包括创建带表达式的谓词,使用.in等,但没有任何效果。

下面的代码成功了:

Set<String> models = getHundredsOfModels(); 
if (models.size()>1000) throw new TooManyResultsException(); // Oracle limit

CriteriaBuilder cb          = em.getCriteriaBuilder();
CriteriaQuery<User> cQuery  = cb.createQuery(User.class);
Root<User> user             = cQuery.from(User.class);
List<Predicate> predicates  = new ArrayList<Predicate>();

//  This lines are the trick  ------------------------------------------
Join<User, Car> usersCars   = user.join("cars", JoinType.INNER);
Predicate p                 = usersCars.<String>get("model").in(models);
// ---------------------------------------------------------------------    

predicates.add(p);
cQuery.select(user).where(predicates.toArray(new Predicate[predicates.size()]));

为什么投票结果如此接近?不需要其他数据来理解问题。这里唯一缺少的是我没有的解决方案。我不需要代码,只要告诉我正确的方向就行了,如果你知道答案的话。出错的地方可能是没有工作的那一点,很危险地接近它不工作的地方。我将用代码来说明您尝试过的内容,而不是一个遥远的描述,对我来说,in子句确实是一种方法。你会意识到你需要加入。因此,在使用条件时,您需要相同的东西:从用户u中选择不同的u加入u.cars c,其中c.model in:models。请注意,例如Oracle在in子句中有1000个元素的限制。@JBNizet在阅读了一个在类似情况下避免连接的SO答案后,我试图避免这种情况,但我越想它,我越觉得它是唯一的选择。那我就限制在1000以内。。。谢谢你,请随意把它作为答案贴出来,这样我就可以投票了it@JBNizet它就像一个符咒。我现在只需要对它进行基准测试,但既然这是唯一的方法,谁在乎呢。还是谢谢