package net.techreadiness.persistence.dao;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import net.techreadiness.persistence.domain.EntityDO;
import net.techreadiness.persistence.domain.EntityDO_;
import net.techreadiness.persistence.domain.EntityTypeDO;
import net.techreadiness.persistence.domain.ScopeDO_;
import org.springframework.stereotype.Repository;
@Repository
public class EntityTypeDAOImpl extends BaseDAOImpl<EntityTypeDO> implements EntityTypeDAO {
@Override
public List<EntityTypeDO> getEntitiesNotDefinedForScope(Long scopeId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EntityTypeDO> cq = cb.createQuery(EntityTypeDO.class);
Root<EntityTypeDO> root = cq.from(EntityTypeDO.class);
Subquery<EntityTypeDO> subQuery = cq.subquery(EntityTypeDO.class);
Root<EntityDO> fromEntity = subQuery.from(EntityDO.class);
subQuery.select(fromEntity.get(EntityDO_.entityType));
Predicate scope = cb.equal(fromEntity.get(EntityDO_.scope).get(ScopeDO_.scopeId), scopeId);
subQuery.where(scope);
cq.where(cb.not(cb.in(root).value(subQuery)));
return em.createQuery(cq).setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList();
}
}