【问题标题】:JPA CriteriaBuilder - Expression <List>JPA CriteriaBuilder - 表达式 <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 我已经用我认为我需要的伪代码更新了示例代码......希望这能解释一下吗?感谢您的回复...

标签: hibernate jpa orm jpa-2.0 criteria-api


【解决方案1】:

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

https://stackoverflow.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 的用法在相关问题上帮助了我很多
    猜你喜欢
    • 2016-12-09
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多