Skip to content

Commit

Permalink
Merge branch '2.2.x'
Browse files Browse the repository at this point in the history
Conflicts:
	grails-test-suite-uber/src/test/groovy/grails/util/GrailsUtilTests.java
  • Loading branch information
graemerocher committed Oct 9, 2012
2 parents a09363c + c160964 commit aca3d75
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,15 @@
public class HibernateCriterionAdapter {
private static final Map<Class<?>, CriterionAdaptor> criterionAdaptors = new HashMap<Class<?>, CriterionAdaptor>();
private String alias;
private PersistentEntity entity;

public HibernateCriterionAdapter(Query.Criterion criterion, String alias) {
public HibernateCriterionAdapter(PersistentEntity entity, Query.Criterion criterion, String alias) {
this.criterion = criterion;
this.alias = alias;
this.entity = entity;
}


static {
criterionAdaptors.put(DetachedAssociationCriteria.class, new CriterionAdaptor() {
@Override
Expand Down Expand Up @@ -326,6 +329,9 @@ private static void applySubCriteriaToJunction(PersistentEntity entity, Hibernat
HibernateCriteriaBuilder.getHibernateDetachedCriteria((QueryableCriteria<?>) pc.getValue())
);
}
else {
HibernateQuery.doTypeConversionIfNeccessary(entity, pc);
}
}
CriterionAdaptor criterionAdaptor = criterionAdaptors.get(subCriterion.getClass());
if (criterionAdaptor != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
import org.hibernate.persister.entity.PropertyMapping;
import org.hibernate.type.BasicType;
import org.hibernate.type.TypeResolver;
import org.springframework.core.convert.ConversionException;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.orm.hibernate3.HibernateTemplate;
Expand All @@ -59,6 +63,7 @@ public class HibernateQuery extends Query {
private Map<String, CriteriaAndAlias> createdAssociationPaths = new HashMap<String, CriteriaAndAlias> ();
private static final String ALIAS = "_alias";
private static Field opField = ReflectionUtils.findField(SimpleExpression.class, "op");
private static ConversionService conversionService = new DefaultConversionService();

public HibernateQuery(Criteria criteria, HibernateSession session, PersistentEntity entity) {
super(session, entity);
Expand Down Expand Up @@ -106,17 +111,30 @@ public void add(Criterion criterion) {
}
else if (criterion instanceof PropertyCriterion) {
PropertyCriterion pc = (PropertyCriterion) criterion;
if (pc.getValue() instanceof QueryableCriteria) {
DetachedCriteria hibernateDetachedCriteria = HibernateCriteriaBuilder.getHibernateDetachedCriteria((QueryableCriteria) pc.getValue());
Object value = pc.getValue();
if (value instanceof QueryableCriteria) {
DetachedCriteria hibernateDetachedCriteria = HibernateCriteriaBuilder.getHibernateDetachedCriteria((QueryableCriteria) value);
pc.setValue(hibernateDetachedCriteria);
}
else {
doTypeConversionIfNeccessary(getEntity(), pc);
}
}
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(criterion, alias).toHibernateCriterion(this);
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(getEntity(), criterion, alias).toHibernateCriterion(this);
if (hibernateCriterion != null) {
addToCriteria(hibernateCriterion);
}
}

static void doTypeConversionIfNeccessary(PersistentEntity entity, PropertyCriterion pc) {
String property = pc.getProperty();
Object value = pc.getValue();
PersistentProperty p = entity.getPropertyByName(property);
if(p != null && !p.getType().isInstance(value)) {
pc.setValue( conversionService.convert(value, p.getType()));
}
}

org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingCriterion criterion, @SuppressWarnings("hiding") PersistentEntity entity) {
org.hibernate.criterion.Criterion sqlRestriction;HibernateTemplate hibernateSession = (HibernateTemplate)session.getNativeInterface();

Expand All @@ -141,7 +159,7 @@ org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingC
if (basic != null && datastoreCriterion instanceof PropertyCriterion) {

PropertyCriterion pc = (PropertyCriterion) datastoreCriterion;
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(datastoreCriterion, alias).toHibernateCriterion(this);
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(getEntity(),datastoreCriterion, alias).toHibernateCriterion(this);
if (hibernateCriterion instanceof SimpleExpression) {
SimpleExpression expr = (SimpleExpression) hibernateCriterion;
Object op = ReflectionUtils.getField(opField, expr);
Expand Down Expand Up @@ -209,16 +227,16 @@ public Query gt(String property, Object value) {

@Override
public Query and(Criterion a, Criterion b) {
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(getEntity(),a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(getEntity(),a, alias);
addToCriteria(Restrictions.and(aa.toHibernateCriterion(this), ab.toHibernateCriterion(this)));
return this;
}

@Override
public Query or(Criterion a, Criterion b) {
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(getEntity(),a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(getEntity(),a, alias);
addToCriteria(Restrictions.or(aa.toHibernateCriterion(this), ab.toHibernateCriterion(this)));
return this;

Expand Down Expand Up @@ -438,7 +456,7 @@ public Junction add(Criterion c) {
}
}
else {
HibernateCriterionAdapter adapter = new HibernateCriterionAdapter(c, alias);
HibernateCriterionAdapter adapter = new HibernateCriterionAdapter(getEntity(),c, alias);
org.hibernate.criterion.Criterion criterion = adapter.toHibernateCriterion(HibernateQuery.this);
if (criterion != null) {
hibernateJunction.add(criterion);
Expand Down Expand Up @@ -578,7 +596,7 @@ public Query isNotNull(String property) {

@Override
public void add(Criterion criterion) {
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(criterion, alias).toHibernateCriterion(HibernateQuery.this);
final org.hibernate.criterion.Criterion hibernateCriterion = new HibernateCriterionAdapter(getEntity(),criterion, alias).toHibernateCriterion(HibernateQuery.this);
if (hibernateCriterion != null) {
addToCriteria(hibernateCriterion);
}
Expand Down Expand Up @@ -618,16 +636,16 @@ public Query gt(String property, Object value) {

@Override
public Query and(Criterion a, Criterion b) {
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(getEntity(),a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(getEntity(),a, alias);
addToCriteria(Restrictions.and(aa.toHibernateCriterion(HibernateQuery.this), ab.toHibernateCriterion(HibernateQuery.this)));
return this;
}

@Override
public Query or(Criterion a, Criterion b) {
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(a, alias);
HibernateCriterionAdapter aa = new HibernateCriterionAdapter(getEntity(),a, alias);
HibernateCriterionAdapter ab = new HibernateCriterionAdapter(getEntity(),a, alias);
addToCriteria(Restrictions.or(aa.toHibernateCriterion(HibernateQuery.this), ab.toHibernateCriterion(HibernateQuery.this)));
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,12 @@ public List<Association> getAssociations() {
}

public PersistentProperty getPropertyByName(String name) {
return propertiesByName.get(name);
if(getIdentity().getName().equals(name)) {
return getIdentity();
}
else {
return propertiesByName.get(name);
}
}

public Class getJavaClass() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.codehaus.groovy.grails.orm.hibernate
import grails.gorm.DetachedCriteria
import spock.lang.Ignore
import org.codehaus.groovy.control.MultipleCompilationErrorsException
import spock.lang.Issue

/**
* Tests the where method in Grails
Expand All @@ -12,6 +13,19 @@ class WhereMethodSpec extends GormSpec {
List getDomainClasses() {
[Person, Pet]
}
@Issue('GRAILS-9447')
def "Test where query integer type conversion"() {
given:"some people"
createPeopleWithPets()

when:"A where query is used with an integer value and a long property type"
def results = Pet.where { owner.id == 2 }.list()

then:"The correct results are returned and type conversion happens as expected"
results.size() == 3
results[0].id == 3

}

def "Test whereAny method"() {
given:"some people"
Expand Down

0 comments on commit aca3d75

Please sign in to comment.