我有一个简单的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);
我已经使用我想要的伪代码更新了我的代码。非常感谢。
答案 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查询... 我是怎么做到的......