我有一个现有的JPA CriteriaQuery,它连接了几个表:
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> customer= cq.from(Customer.class);
Join<Item, ItemVisibility> itemJoin= ...
Join<Customer, ItemVisibility> customerJoin= ...
我现在需要添加的内容是SQL等效于Oracle的DECODE,如:
DECODE(ItemVisibility.isNameVisible, Item.Name, NULL)
或者在标准SQL中:
CASE
WHEN ItemVisibility.isNameVisible
THEN Item.Name
ELSE NULL
END
所以基本上ItemVisibility表包含了allowance,Customer是否可以看到Item的特定列。
我知道可以使用CriteriaBuilder's selectCase(),但我得到的仍然是一个Expression对象,我不知道它是如何操纵我的JOIN查询的。它需要覆盖查询的列'Item.Name'。
用multiselect()替换这些连接会花费我大量的重构,因为我有更多的连接和表格,而不是上面的例子。