複数のテーブルを結合する既存の JPA CriteriaQuery を取得しました。
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> customer= cq.from(Customer.class);
Join<Item, ItemVisibility> itemJoin= ...
Join<Customer, ItemVisibility> customerJoin= ...
今追加する必要があるのは、次のような Oracle の DECODE に相当する SQL です。
DECODE(ItemVisibility.isNameVisible, Item.Name, NULL)
または標準 SQL では:
CASE
WHEN ItemVisibility.isNameVisible
THEN Item.Name
ELSE NULL
END
したがって、基本的に ItemVisibility テーブルには、顧客がアイテムの特定の列を表示できるかどうかに関係なく、許可が含まれています。
CriteriaBuilder の selectCase()を使用できることはわかっていますが、そこから得られるのは Expression オブジェクトであり、JOIN クエリをどのように操作できるかはわかりません。クエリされた列「Item.Name」をオーバーライドする必要があります。
これらの結合を multiselect() に置き換えると、上記の例で表現したよりもはるかに多くの結合とテーブルがあるため、恐ろしい量のリファクタリングが必要になります。