JPA CriteriaBuilder - 表达式<list> </list>

时间:2014-06-24 22:50:26

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

我有一个简单的CriteriaQuery,我在String实体中对一个简单的搜索Person进行模式匹配,例如searchString总是用{%searchString%进行装饰{1}}

//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个对象。我想更新上面的查询,为String列表的每个元素的每个适用字段(Record)添加类似的“赞”模式匹配。我获得了Record s,如下所示:

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

我已经使用我想要的伪代码更新了我的代码。非常感谢。

2 个答案:

答案 0 :(得分:1)

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

//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)
);

希望有所帮助

答案 1 :(得分:0)

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

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