/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.query.criteria.internal.expression;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.PostgreSQL81Dialect;
import org.hibernate.testing.RequiresDialect;
import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Assert;
import org.junit.Test;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
/**
*
* @author Vasyl Danyliuk
*/
public class SearchedCaseExpressionTest extends BaseCoreFunctionalTestCase {
@Test
@RequiresDialect(H2Dialect.class)
public void testCaseClause() {
doInHibernate( this::sessionFactory, session -> {
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Event> criteria = cb.createQuery(Event.class);
Root<Event> event = criteria.from(Event.class);
Path<EventType> type = event.get("type");
Expression<String> caseWhen = cb.<EventType, String>selectCase(type)
.when(EventType.TYPE1, "Admin Event")
.when(EventType.TYPE2, "User Event")
.when(EventType.TYPE3, "Reporter Event")
.otherwise("");
criteria.select(event);
criteria.where(cb.equal(caseWhen, "Admin Event")); // OK when use cb.like() method and others
List<Event> resultList = session.createQuery(criteria).getResultList();
Assert.assertNotNull(resultList);
} );
}
@Test
public void testEqualClause() {
doInHibernate( this::sessionFactory, session -> {
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Event> criteria = cb.createQuery(Event.class);
Root<Event> event = criteria.from(Event.class);
Path<EventType> type = event.get("type");
Expression<String> caseWhen = cb.<String>selectCase()
.when(cb.equal(type, EventType.TYPE1), "Type1")
.otherwise("");
criteria.select(event);
criteria.where(cb.equal(caseWhen, "Admin Event")); // OK when use cb.like() method and others
List<Event> resultList = session.createQuery(criteria).getResultList();
Assert.assertNotNull(resultList);
} );
}
@Override
protected Class[] getAnnotatedClasses() {
return new Class[]{Event.class, EventType.class};
}
@Entity(name = "Event")
public static class Event {
@Id
private Long id;
@Column
@Enumerated(EnumType.STRING)
private EventType type;
protected Event() {
}
public EventType getType() {
return type;
}
public Event type(EventType type) {
this.type = type;
return this;
}
}
public enum EventType {
TYPE1, TYPE2, TYPE3
}
}