blob: b6e97b5a300da2dd03282f4b9893b2ede17063fa [file] [log] [blame]
/*
* 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);
}
}