package test;
public class SelectCaseTest {
@javax.persistence.Entity
public static class Entity {
@Id
private Long id;
@Enumerated(EnumType.STRING)
private EnumValue value;
}
public enum EnumValue {
VALUE_1,
VALUE_2;
}
private static EntityManagerFactory factory;
private EntityManager entityManager;
@BeforeClass
public static void beforeClass() {
factory = Persistence.createEntityManagerFactory("test");
}
@AfterClass
public static void afterClass() {
factory.close();
}
@Before
public void before() {
entityManager = factory.createEntityManager();
}
@After
public void after() {
entityManager.close();
}
@Test
public void selectCaseWithValuesShouldWork() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
Case<EnumValue> selectCase = cb.selectCase();
Predicate somePredicate = cb.equal(cb.literal(1), 1);
selectCase.when(somePredicate, EnumValue.VALUE_1);
selectCase.otherwise(EnumValue.VALUE_2);
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> from = query.from(Entity.class);
query.select(from).where(cb.equal(from.get("value"), selectCase));
List<?> result = entityManager.createQuery(query).getResultList();
System.out.println(result);
}
@Test
public void selectCaseWithCastedTypeValuesShouldWork() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
Case<String> selectCase = cb.selectCase();
Predicate somePredicate = cb.equal(cb.literal(1), 1);
selectCase.when(somePredicate, EnumValue.VALUE_1.name());
selectCase.otherwise(EnumValue.VALUE_2.name());
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> from = query.from(Entity.class);
query.select(from).where(cb.equal(from.get("value"), selectCase.as(String.class)));
List<?> result = entityManager.createQuery(query).getResultList();
System.out.println(result);
}
@Test
public void simpleSelectCaseWithValuesShouldWork() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
SimpleCase<Integer, EnumValue> selectCase = cb.selectCase(cb.literal(1));
selectCase.when(1, EnumValue.VALUE_1);
selectCase.otherwise(EnumValue.VALUE_2);
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> from = query.from(Entity.class);
query.select(from).where(cb.equal(from.get("value"), selectCase));
List<?> result = entityManager.createQuery(query).getResultList();
System.out.println(result);
}
@Test
public void simpleSelectCaseWithCastedTypeValuesShouldWork() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
SimpleCase<Integer, String> selectCase = cb.selectCase(cb.literal(1));
selectCase.when(1, EnumValue.VALUE_1.name());
selectCase.otherwise(EnumValue.VALUE_2.name());
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> from = query.from(Entity.class);
query.select(from).where(cb.equal(from.get("value"), selectCase.as(String.class)));
List<?> result = entityManager.createQuery(query).getResultList();
System.out.println(result);
}
}