我需要在Java中构建一个动态查询(带有可选的过滤参数和条件)。我决定使用Criteria API,因为它似乎是最灵活的方法。
一个例子的条件,我试图实现(Mysql的角度):
WHERE idClient = X AND ( idChannel = 1 OR idChannel = 2 OR idChannel = 25) AND filter LIKE '%test%'
参数"criteria"是带有idChannel过滤器的谓词列表,创建方式如下:
//Filter by channel
for (Channel channel : channels){
Predicate channelFilter = qb.equal(address.get(AddressBlocked_.idChannel), channel);
criteria.add(channelFilter);
}
我使用Criteria API (Java透视图)编写的条件:
Predicate predicate = qb.and(
//Client filter
qb.equal(address.get(AddressBlocked_.idClient), idClient),
//Channel filter
qb.or(
criteria.toArray(new Predicate[criteria.size()])
),
//Address filter
qb.like(address.get(AddressBlocked_.address), "%"+search+"%")
);
当地址过滤器"search"变量有任何值时,列表返回null,否则按通道和客户端过滤工作完美。
我没能在我的CriteriaQuery中实现LIKE过滤选项。我还应该使用其他方法或提示吗?
也许可以尝试在通配符上使用星号,如下所示:
http://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html