JPA CriteriaBuilder - 表达式 <List>

Posted

技术标签:

【中文标题】JPA CriteriaBuilder - 表达式 <List>【英文标题】:JPA CriteriaBuilder - Expression <List> 【发布时间】:2014-08-15 08:44:30 【问题描述】:

我有一个简单的CriteriaQuery,我在其中将简单的搜索StringPerson 实体中的字段整体进行模式匹配...例如searchString 总是用%searchString% 装饰

//using MetaModel
Expression<List<Records>> records = root.get(Person_.records);
Expression<String> param = builder.parameter(String.class);

//pseudo code(i think i need something like this here)
Predicate myPred = for all records (any record.FIELD LIKE searchString)

Path<Integer> status = root.get("status");

criteriaQuery.where(
    builder.or(
        builder.like(
            root.<String>get("name"), searchString
        ),
        builder.like(
            root.<String>get("second_name"), searchString
        )
        //pseuso code (i thin i need to check my predicate here?)
        builder.like(mypredicate)



    ),
    builder.equal(status,value)
);

Person 对象可以包含许多 Record 对象。我想更新上面的查询,为Records 列表的每个元素的每个适用字段 (String) 包含一个类似的“喜欢”模式匹配。我获得了Records,如下所示:

//using MetaModel
Expression<List<Records>> records = root.get(Person_.records);
Expression<String> param = builder.parameter(String.class);

我已经用我“认为”我想要的伪代码更新了我的代码。非常感谢任何帮助。

【问题讨论】:

您能否提供一些有关您遇到的问题的其他详细信息,例如:有关您正在尝试实现的目标的更多详细信息,以及您正在尝试的内容以及有关如何或为什么无法正常工作的详细信息? 嗨,肖恩,感谢您的回复。试图解决的问题:搜索与搜索字符串匹配的所有数据库条目。这在构建用于搜索上述“基本字段”的条件时很好。我现在想扩展搜索以包括嵌入的 Lissy of Record 对象中的条目。例如,如果在“tim”上搜索在姓名或姓氏中具有匹配字段的任何人 obj,或者如果任何记录 obj 具有匹配字段,则将返回人 obj。 @SeanMickey 嗨,肖恩,感谢您的回复。试图解决的问题:搜索与搜索字符串匹配的所有数据库条目。如上所述构建搜索“基本字段”的条件时,这很好。我现在想扩展搜索以包括 Record 对象的嵌入式 lisr 中的条目。例如,如果在 'tim' 上搜索任何在姓名或姓氏中具有匹配字段的人员 obj,或者如果其任何记录 obj 具有匹配字段,则将返回人员 obj。 @SeanMickey 我已经用我认为我需要的伪代码更新了示例代码......希望这能解释一下吗?感谢您的回复... 【参考方案1】:

据我所知,使用 CriteriaQuery 是不可能的。我需要使用 SQL 查询... 我是这样做的...

https://***.com/a/24488081/1843591

【讨论】:

【参考方案2】:

至少对于 jpa 2.1 是可能的。首先声明两个实体之间的连接,然后使用创建的连接来通过变量。

//using MetaModel
Expression<List<Records>> records = root.get(Person_.records);
Expression<String> param = builder.parameter(String.class);

SetJoin<Person, Record> joinRecord = root.joinSet("records", JoinType.INNER);

Path<Integer> status = root.get("status");

criteriaQuery.where(
    builder.or(
        builder.like(
            root.<String>get("name"), searchString
        ),
        builder.like(
            root.<String>get("second_name"), searchString
        ),            
        builder.like(
            joinRecord.<String>get("FIELD_NAME"), searchString
        )


    ),
    builder.equal(status,value)
);

希望对你有帮助

【讨论】:

谢谢,这种格式很有帮助。我不知道你可以用泛型做到这一点 我一直在寻找一个解决方案,以找到将表达式和条件与联接(尤其是 @ManyToMany JPA 联接)结合使用的解决方案。尽管有这个老问题,但非常感谢。 :) 谢谢! Join 的用法在相关问题上帮助了我很多

以上是关于JPA CriteriaBuilder - 表达式 <List>的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?

使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列

java-jpa-criteriaBuilder使用入门

JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?

真正动态的 JPA CriteriaBuilder

JPA Eclipselink子查询在where子句之间,CriteriaBuilder和元模型