/* * Copyright 2014 - 2017 Blazebit. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.blazebit.persistence.testsuite; import com.blazebit.persistence.CriteriaBuilder; import com.blazebit.persistence.testsuite.base.category.NoDatanucleus; import com.blazebit.persistence.testsuite.base.category.NoEclipselink; import com.blazebit.persistence.testsuite.base.category.NoHibernate42; import com.blazebit.persistence.testsuite.base.category.NoHibernate43; import com.blazebit.persistence.testsuite.base.category.NoHibernate50; import com.blazebit.persistence.testsuite.base.category.NoHibernate51; import com.blazebit.persistence.testsuite.base.category.NoHibernate52; import com.blazebit.persistence.testsuite.base.category.NoOpenJPA; import com.blazebit.persistence.testsuite.entity.Document; import com.blazebit.persistence.testsuite.entity.Person; import org.junit.Test; import org.junit.experimental.categories.Category; import static org.junit.Assert.assertEquals; /** * Test that asserts Hibernate versions which can't handle entity comparisons do id rewrites. * * @author Christian Beikov * @since 1.2.0 */ @Category({ NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public class EntityEqualityRewriteToIdTest extends AbstractCoreTest { @Test // This actually only makes sense for Hibernate 5.1 @Category({ NoHibernate42.class, NoHibernate43.class, NoHibernate50.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityAssociationEqualsEntityInOnToIdEquals() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p.partnerDocument").eqExpression("d") .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p.partnerDocument.id = d.id"), criteria.getQueryString()); criteria.getResultList(); } @Test // Pre Hibernate 5.1 we could do this broken thing to make some stuff work @Category({ NoHibernate51.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityAssociationEqualsEntityInOnToIdEqualsBroken() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p.partnerDocument").eqExpression("d") .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p.partnerDocument.id = d"), criteria.getQueryString()); criteria.getResultList(); } @Test public void rewriteEntityAssociationEqualsParameterInOnToIdEquals() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p.partnerDocument").eq(new Document(1L)) .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p.partnerDocument.id = :param_0"), criteria.getQueryString()); criteria.getResultList(); } @Test // This actually only makes sense for Hibernate 5.1 @Category({ NoHibernate42.class, NoHibernate43.class, NoHibernate50.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityEqualsEntityAssociationInOnToIdEquals() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p").eqExpression("d.owner") .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p.id = d.owner.id"), criteria.getQueryString()); criteria.getResultList(); } @Test // Pre Hibernate 5.1 we could do this broken thing to make some stuff work @Category({ NoHibernate51.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityEqualsEntityAssociationInOnToIdEqualsBroken() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p").eqExpression("d.owner") .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p = d.owner.id"), criteria.getQueryString()); criteria.getResultList(); } @Test // This actually only makes sense for Hibernate 5.1 @Category({ NoHibernate42.class, NoHibernate43.class, NoHibernate50.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityEqualsTransientEntityParameterInOn() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p").eq(new Person(1L)) .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p.id = :param_0"), criteria.getQueryString()); criteria.getResultList(); } @Test // Pre Hibernate 5.1 we could do this broken thing to make some stuff work @Category({ NoHibernate51.class, NoHibernate52.class, NoDatanucleus.class, NoEclipselink.class, NoOpenJPA.class }) public void rewriteEntityEqualsTransientEntityParameterInOnBroken() { CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d"); criteria.innerJoinOn("partners","p") .on("p").eq(new Person(1L)) .end(); assertEquals("SELECT d FROM Document d JOIN d.partners p" + onClause("p = :param_0"), criteria.getQueryString()); criteria.getResultList(); } }