/*
* 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.test.annotations.formula;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.annotations.Formula;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.criterion.Order;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.testing.RequiresDialect;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* Test that the queries generated by {@link org.hibernate.annotations.Formula} properly ignore type names when escaping identifiers.
* <p/>
* Created by Michael Hum on 17/07/2015.
*/
@RequiresDialect(H2Dialect.class)
public class FormulaWithColumnTypesTest extends BaseCoreFunctionalTestCase {
@Override
protected void configure(Configuration configuration) {
configuration.setProperty(
Environment.DIALECT,
ExtendedDialect.class.getName()
);
}
@Test
@TestForIssue(jiraKey = "HHH-9951")
public void testFormulaAnnotationWithTypeNames() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
DisplayItem displayItem20 = new DisplayItem();
displayItem20.setDisplayCode( "20" );
DisplayItem displayItem03 = new DisplayItem();
displayItem03.setDisplayCode( "03" );
DisplayItem displayItem100 = new DisplayItem();
displayItem100.setDisplayCode( "100" );
session.persist( displayItem20 );
session.persist( displayItem03 );
session.persist( displayItem100 );
transaction.commit();
session.close();
// 1. Default sorting by display code natural ordering (resulting in 3-100-20).
session = openSession();
transaction = session.beginTransaction();
List displayItems = session.createCriteria( DisplayItem.class )
.addOrder( Order.asc( "displayCode" ) )
.list();
assertNotNull( displayItems );
assertEquals( displayItems.size(), 3 );
assertEquals(
"03",
( (DisplayItem) displayItems.get( 0 ) ).getDisplayCode()
);
assertEquals(
"100",
( (DisplayItem) displayItems.get( 1 ) ).getDisplayCode()
);
assertEquals(
"20",
( (DisplayItem) displayItems.get( 2 ) ).getDisplayCode()
);
transaction.commit();
session.close();
// 2. Sorting by the casted type (resulting in 3-20-100).
session = openSession();
transaction = session.beginTransaction();
List displayItemsSortedByInteger = session.createCriteria( DisplayItem.class )
.addOrder( Order.asc( "displayCodeAsInteger" ) )
.list();
assertNotNull( displayItemsSortedByInteger );
assertEquals( displayItemsSortedByInteger.size(), 3 );
assertEquals(
"03",
( (DisplayItem) displayItemsSortedByInteger.get( 0 ) ).getDisplayCode()
);
assertEquals(
"20",
( (DisplayItem) displayItemsSortedByInteger.get( 1 ) ).getDisplayCode()
);
assertEquals(
"100",
( (DisplayItem) displayItemsSortedByInteger.get( 2 ) ).getDisplayCode()
);
transaction.commit();
session.close();
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {DisplayItem.class};
}
/**
* Test entity for formulas.
* <p>
* INTEGER is registered as a keyword for testing lower-case sensitivity.
* FLOAT is registered as a valid column type with oracle dialects.
* <p>
* Created by Michael Hum on 17/07/2015.
*/
@Entity(name = "DisplayItem")
public static class DisplayItem implements Serializable {
private int id;
private String displayCode;
private Integer displayCodeAsInteger;
private Integer displayCodeAsFloat;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "DISPLAY_CODE")
public String getDisplayCode() {
return this.displayCode;
}
public void setDisplayCode(final String displayCode) {
this.displayCode = displayCode;
}
@Formula("CAST(DISPLAY_CODE AS FLOAT)")
public Integer getDisplayCodeAsFloat() {
return displayCodeAsFloat;
}
public void setDisplayCodeAsFloat(final Integer displayCodeAsFloat) {
this.displayCodeAsFloat = displayCodeAsFloat;
}
@Formula("CAST(DISPLAY_CODE AS INTEGER)")
public Integer getDisplayCodeAsInteger() {
return displayCodeAsInteger;
}
public void setDisplayCodeAsInteger(final Integer displayCodeAsInteger) {
this.displayCodeAsInteger = displayCodeAsInteger;
}
}
/**
* Dialect for test case where we register a keyword and see if it gets escaped or not.
* <p>
* Created by Mike on 18/07/2015.
*/
public static class ExtendedDialect extends H2Dialect {
public ExtendedDialect() {
super();
registerKeyword( "INTEGER" );
}
}
}