package pl.com.bottega.documentmanagement.infrastructure; import com.google.common.collect.Sets; import org.springframework.stereotype.Repository; import pl.com.bottega.documentmanagement.domain.Employee; import pl.com.bottega.documentmanagement.domain.EmployeeId; import pl.com.bottega.documentmanagement.domain.Role; import pl.com.bottega.documentmanagement.domain.Role_; import pl.com.bottega.documentmanagement.domain.repositories.EmployeeRepository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.util.Collection; import java.util.List; import java.util.Set; /** * Created by maciuch on 19.06.16. */ @Repository public class JPAEmployeeRepository implements EmployeeRepository { @PersistenceContext private EntityManager entityManager; @Override public void save(Employee employee) { entityManager.merge(employee); } @Override public Employee findByEmployeeId(EmployeeId employeeId) { return entityManager.find(Employee.class, employeeId); } @Override public boolean isLoginOccupied(String login) { return entityManager. createQuery("SELECT count(e) " + "FROM Employee e " + "WHERE login=:login", Long.class). setParameter("login", login). getSingleResult() > 0; } @Override public Employee findByLoginAndPassword(String login, String hashedPassword) { List<Employee> employees = entityManager. createQuery("FROM Employee " + "WHERE login=:login AND hashedPassword=:pwd", Employee.class). setParameter("login", login). setParameter("pwd", hashedPassword). getResultList(); if (employees.size() == 0) return null; else return employees.get(0); } @Override public Collection<Role> getRoles(Set<String> roleNames) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<Role> criteriaQuery = criteriaBuilder.createQuery(Role.class); Root<Role> root = criteriaQuery.from(Role.class); criteriaQuery.select(root); criteriaQuery.where(root.get(Role_.name).in(roleNames)); return entityManager.createQuery(criteriaQuery).getResultList(); } @Override public Set<Employee> findByEmployeeIds(Iterable<EmployeeId> ids) { Query q = entityManager.createQuery("FROM Employee WHERE employeeId in :ids"); q.setParameter("ids", ids); return Sets.newHashSet(q.getResultList()); } }