Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 具有一对多和多对一关系的CriteriaQuery_Java_Jpa_Eclipselink - Fatal编程技术网

Java 具有一对多和多对一关系的CriteriaQuery

Java 具有一对多和多对一关系的CriteriaQuery,java,jpa,eclipselink,Java,Jpa,Eclipselink,我有3个表有疑问:PrblFldr-->PRBLFLDRATRBVAL-->PrblTmpltAtrbt。它们之间的关系分别是“一对多”和“多对一” 我正在使用CriteriaBuilder对PrblFldr对象执行搜索。我需要通过与PrblFldr关联的每个PrblFldrAtrbtVal的值进行搜索。查询参数的键是将每个PrblFldrAtrbtVal与PrblTmpltAtrbt关联的唯一PK;参数的值是要在PrblFldrAtrbtVal的值中搜索的内容 以下是我迄今为止的代码(编辑过的

我有3个表有疑问:PrblFldr-->PRBLFLDRATRBVAL-->PrblTmpltAtrbt。它们之间的关系分别是“一对多”和“多对一”

我正在使用
CriteriaBuilder
PrblFldr
对象执行搜索。我需要通过与
PrblFldr
关联的每个
PrblFldrAtrbtVal
的值进行搜索。查询参数的键是将每个
PrblFldrAtrbtVal
PrblTmpltAtrbt
关联的唯一PK;参数的值是要在
PrblFldrAtrbtVal
的值中搜索的内容

以下是我迄今为止的代码(编辑过的):

@GET
@路径(“/folders/search”)
公共响应搜索文件夹(@Context-UriInfo-UriInfo){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(PrblFldr.class);
根文件夹=cq.from(PrblFldr.class);
Join attributes=folder.Join(“prblFldrAtrbtVals”);
Join attributeTemplates=attributes.Join(“prblTmpltAtrbt”);
列表谓词=新的ArrayList();
多值Map queryParams=uriInfo.getQueryParameters();
for(字符串键:queryParams.keySet()){
字符串值=queryParams.getFirst(key.replaceAll(“\u”,“\\\”);
add(cb.and(cb.equal(attributeTemplates.get(“tmpltAtrbtSeqId”),key),
cb.like(attributes.get(“fldrAtrbtVal”)、“%”+value+“%”、“\\”);
}
distinct(true).select(folder).where(cb.and(predicates.toArray(newpredicate[]{}));
List results=em.createQuery(cq.getResultList();
返回Response.ok(gson.toJson(results),MediaType.APPLICATION_JSON.build();
}
已编辑:如果我只传入一个要搜索的键/值对,它当前正在工作。如果我传入多个要搜索的
PrblFldrAtrbtVal
,则返回一个空白结果集,尽管一个或多个
PrblFldr
对象应与指定的
PrblFldrAtrbtVal
对象匹配


我认为这与
cq.where()
子句中的
cb.and()
语句有关。我确实想要一个“AND”,但为什么不返回结果呢?

查询返回的是一个空列表,因为谓词添加了一个“AND”。 i、 例如,正在生成的查询类似于

tmpltAtrbtSeqId = '1' AND fldrAtrbtVal like '%a%'
AND tmpltAtrbtSeqId = '2' AND fldrAtrbtVal like '%b%'
AND tmpltAtrbtSeqId = '3' AND fldrAtrbtVal like '%c%'
当您传入多个键/值对时


您需要在for循环中添加一个'OR'子句。

哦,我明白了,但是我不希望'OR'子句在谓词转换为数组时出现在谓词上吗?我确实希望for循环中的两个语句被AND'ed,因为它们确保值和
tmpltAtrbtSeqId
匹配正确的
PrblFldrAtrbtVal
。我在尝试了您的建议后编辑了我的原始帖子。请查看新版本。我认为您需要在查询中添加一个“DISTINCT”。请检查是的,你是对的。还有一件事(很抱歉!),看起来(因为属性是OR'ed在一起的),我实际上没有得到我想要的结果集;事实上,我确实希望这些属性被合并在一起,因此如果用户指定了多个属性,它应该查找包含所有指定属性的文件夹。同样,将其更改为“AND”将返回一个空白结果集。哦,好的。我们在项目中遇到了这样的情况。您需要的是一个交叉点查询。您将需要获取与第一个键匹配的PRBLFLDRATRBVAL列表、与第二个键匹配的PRBLFLDRATRBVAL列表、与第三个键匹配的PRBLFLDRATRBVAL列表(依此类推),并将它们相交。不确定如何使用CriteriaBuilder完成此操作。如果您给我表定义,我可能会给您一个jpa查询。
tmpltAtrbtSeqId = '1' AND fldrAtrbtVal like '%a%'
AND tmpltAtrbtSeqId = '2' AND fldrAtrbtVal like '%b%'
AND tmpltAtrbtSeqId = '3' AND fldrAtrbtVal like '%c%'