| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.openjpa.persistence.criteria; |
| |
| import javax.persistence.criteria.CollectionJoin; |
| import javax.persistence.criteria.CriteriaQuery; |
| import javax.persistence.criteria.Join; |
| import javax.persistence.criteria.JoinType; |
| import javax.persistence.criteria.ListJoin; |
| import javax.persistence.criteria.MapJoin; |
| import javax.persistence.criteria.Root; |
| import javax.persistence.criteria.SetJoin; |
| import javax.persistence.metamodel.Bindable; |
| |
| /** |
| * Tests Criteria Queries that use Join. |
| * |
| * @author Pinaki Poddar |
| * |
| */ |
| public class TestJoinCondition extends JoinDomainTestCase { |
| public void testSingleAttributeJoinModel() { |
| CriteriaQuery<?> cq = cb.createQuery(); |
| Root<A> a = cq.from(A.class); |
| Join<A,B> b = a.join(A_.b); |
| assertTrue(b.getModel() instanceof Bindable); |
| assertSame(B.class, b.getJavaType()); |
| } |
| |
| public void testCollectionJoinModel() { |
| CriteriaQuery<?> cq = cb.createQuery(); |
| Root<C> c = cq.from(C.class); |
| CollectionJoin<C,D> d = c.join(C_.coll); |
| assertSame(D.class, d.getJavaType()); |
| } |
| |
| public void testSetJoinModel() { |
| CriteriaQuery<?> cq = cb.createQuery(); |
| Root<C> c = cq.from(C.class); |
| SetJoin<C,D> d = c.join(C_.set); |
| assertSame(D.class, d.getJavaType()); |
| } |
| |
| public void testListJoinModel() { |
| CriteriaQuery<?> cq = cb.createQuery(); |
| Root<C> c = cq.from(C.class); |
| ListJoin<C,D> d = c.join(C_.list); |
| assertSame(D.class, d.getJavaType()); |
| } |
| |
| public void testInnerJoinSingleAttributeWithoutCondition() { |
| String jpql = "select a from A a INNER JOIN a.b b"; |
| CriteriaQuery<A> c = cb.createQuery(A.class); |
| c.from(A.class).join(A_.b, JoinType.INNER); |
| |
| assertEquivalence(c, jpql); |
| } |
| |
| public void testCrossJoinWithoutCondition() { |
| String jpql = "select a from A a, C c"; |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| Root<C> c = cq.from(C.class); |
| cq.select(a); |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testCrossJoinWithoutCondition1() { |
| String jpql = "select a, c from A a, C c"; |
| CriteriaQuery<?> cq = cb.createQuery(); |
| Root<A> a = cq.from(A.class); |
| Root<C> c = cq.from(C.class); |
| cq.multiselect(a, c); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testCrossJoin() { |
| String jpql = "select a from A a, C c where a.name=c.name"; |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| Root<C> c = cq.from(C.class); |
| cq.where(cb.equal(a.get(A_.name), c.get(C_.name))); |
| cq.select(a); |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testInnerJoinSingleAttribute() { |
| String jpql = "select a from A a INNER JOIN a.b b WHERE a.id=b.age"; |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| Join<A,B> b = a.join(A_.b); |
| cq.where(cb.equal(a.get(A_.id), b.get(B_.age))); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testOuterJoinSingleAttributeWithoutCondition() { |
| String jpql = "select a from A a LEFT JOIN a.b b"; |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| Join<A,B> b = a.join(A_.b, JoinType.LEFT); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testOuterJoinSingleAttribute() { |
| String jpql = "select a from A a LEFT JOIN a.b b where a.id=b.age"; |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| Join<A,B> b = a.join(A_.b, JoinType.LEFT); |
| cq.where(cb.equal(a.get(A_.id), b.get(B_.age))); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testSetJoinWithoutCondition() { |
| String jpql = "select c from C c JOIN c.set d"; |
| CriteriaQuery<C> c = cb.createQuery(C.class); |
| c.from(C.class).join(C_.set); |
| |
| assertEquivalence(c, jpql); |
| } |
| |
| public void testListJoinWithoutCondition() { |
| String jpql = "select c from C c JOIN c.list d"; |
| CriteriaQuery<C> c = cb.createQuery(C.class); |
| c.from(C.class).join(C_.list); |
| |
| assertEquivalence(c, jpql); |
| } |
| |
| public void testCollectionJoinWithoutCondition() { |
| String jpql = "select c from C c JOIN c.coll d"; |
| CriteriaQuery<C> c = cb.createQuery(C.class); |
| c.from(C.class).join(C_.coll); |
| |
| assertEquivalence(c, jpql); |
| } |
| |
| public void testMapJoinWithoutCondition() { |
| String jpql = "select c from C c JOIN c.map d"; |
| CriteriaQuery<C> c = cb.createQuery(C.class); |
| c.from(C.class).join(C_.map); |
| |
| assertEquivalence(c, jpql); |
| } |
| |
| public void testKeyExpression() { |
| String jpql = "select c from C c JOIN c.map d where KEY(d)=33"; |
| CriteriaQuery<C> cq = cb.createQuery(C.class); |
| Root<C> c = cq.from(C.class); |
| MapJoin<C,Integer,D> d = c.join(C_.map); |
| cq.where(cb.equal(d.key(),33)); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testValueExpression() { |
| String jpql = "select c from C c JOIN c.map d where VALUE(d).name='xy'"; |
| CriteriaQuery<C> cq = cb.createQuery(C.class); |
| Root<C> c = cq.from(C.class); |
| MapJoin<C,Integer,D> d = c.join(C_.map); |
| cq.where(cb.equal(d.value().get(D_.name),"xy")); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testFetchJoin() { |
| String jpql = "select a from A a JOIN FETCH a.b"; |
| |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| a.fetch(A_.b); |
| |
| assertEquivalence(cq, jpql); |
| } |
| |
| public void testOuterFetchJoin() { |
| String jpql = "select a from A a LEFT JOIN FETCH a.b"; |
| |
| CriteriaQuery<A> cq = cb.createQuery(A.class); |
| Root<A> a = cq.from(A.class); |
| a.fetch(A_.b, JoinType.LEFT); |
| |
| assertEquivalence(cq, jpql); |
| } |
| } |