Java で動的クエリ (オプションのフィルタリング パラメーターと条件を使用) を作成する必要があります。Criteria API が最も柔軟なアプローチに思えたので、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+"%")
);
アドレス フィルターの「検索」変数に値がある場合は常に、リストは null を返します。それ以外の場合は、チャネルとクライアントによるフィルター処理が完全に機能します。
CriteriaQuery に LIKE フィルタリング オプションを実装できませんでした。私が使用する必要がある他のアプローチまたはヒントはありますか?