package au.com.vaadinutils.dao;
import java.util.List;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import javax.persistence.metamodel.SetAttribute;
import javax.persistence.metamodel.SingularAttribute;
import au.com.vaadinutils.dao.JpaBaseDao.Condition;
public class JpaDslSubqueryBuilder<P, E> extends JpaDslBuilder<E>
{
private Subquery<E> subQuery;
private Root<P> parentRoot;
JpaDslSubqueryBuilder(Class<E> entityClass, CriteriaQuery<?> query, Root<P> parentRoot)
{
super(entityClass);
criteria = null;
this.parentRoot = parentRoot;
subQuery = query.subquery(entityClass);
root = subQuery.from(entityClass);
subQuery.select(root);
}
/**
* join on parent.child = child
*
* @param parentAttrib
* @return
*/
public AbstractCondition<E> joinParentQueryOnParentAttrib(final SingularAttribute<P, E> parentAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot.get(parentAttrib), root);
}
};
}
/**
* join on parent.child = child
*
* @param parentAttrib
* @return
*/
public AbstractCondition<E> joinParentQueryOnParentAttrib(final SetAttribute<P, E> parentAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot.get(parentAttrib), root);
}
};
}
/**
* join on parent = child.parent
*
* @param parentAttrib
* @return
*/
public AbstractCondition<E> joinParentQueryOnSubAttrib(final SingularAttribute<E, P> subQueryAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot, root.get(subQueryAttrib));
}
};
}
/**
* join on parent = child.parent
*
* @param parentAttrib
* @return
*/
public AbstractCondition<E> joinParentQueryOnSubAttrib(final SetAttribute<E, P> subQueryAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot, root.get(subQueryAttrib));
}
};
}
/**
* join on parent.someattrib = child.someattrib
*
* @param parentAttrib
* @param subQueryAttrib
* @return
*/
public <V> AbstractCondition<E> joinParentQuery(final SingularAttribute<P, V> parentAttrib,
final SetAttribute<E, V> subQueryAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot.get(parentAttrib), root.get(subQueryAttrib));
}
};
}
/**
* join on parent.someattrib = child.someattrib
*
* @param parentAttrib
* @param subQueryAttrib
* @return
*/
public <V> AbstractCondition<E> joinParentQuery(final SingularAttribute<P, V> parentAttrib,
final SingularAttribute<E, V> subQueryAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot.get(parentAttrib), root.get(subQueryAttrib));
}
};
}
/**
* join on parent.child.someattrib = child.someattrib
*
* @param subQueryAttrib
* @param parentAttrib
*
* @return
*/
public <V, J> Condition<E> joinParentQuery(final SingularAttribute<P, V> parentAttrib,
final JoinBuilder<E, J> join, final SingularAttribute<J, V> subQueryAttrib)
{
return new AbstractCondition<E>()
{
@Override
public Predicate getPredicates()
{
return builder.equal(parentRoot.get(parentAttrib), getJoin(join).get(subQueryAttrib));
}
};
}
public Subquery<E> getSubQuery()
{
if (predicate != null)
{
subQuery.where(predicate);
}
return subQuery;
}
@Override
public int delete()
{
throw new RuntimeException("Not Implemented");
}
@Override
public Long count()
{
throw new RuntimeException("Not Implemented");
}
@Override
public List<E> getResultList()
{
throw new RuntimeException("Not Implemented");
}
@Override
public E getSingleResultOrNull()
{
throw new RuntimeException("Not Implemented");
}
@Override
public E getSingleResult()
{
throw new RuntimeException("Not Implemented");
}
}