TeacherDao.java

package training_center.dao;

import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import training_center.entity.Course;
import training_center.entity.Teacher;

@Repository
@Transactional
public class TeacherDao {
    @PersistenceContext
    private EntityManager entityManager;

    public void save(Teacher teacher) {
        entityManager.persist(teacher);
    }

    @Transactional(readOnly = true)
    public Teacher findById(Long id) {
        return entityManager.find(Teacher.class, id);
    }

    @Transactional(readOnly = true)
    public List<Teacher> findAll() {
        return entityManager.createQuery(
                "select t from Teacher t order by t.fullName",
                Teacher.class
        ).getResultList();
    }

    @Transactional(readOnly = true)
    public List<Teacher> findByFullName(String fullNamePart) {
        return entityManager.createQuery(
                "select t from Teacher t " +
                "where lower(t.fullName) like lower(:fullNamePart) " +
                "order by t.fullName",
                Teacher.class
        )
        .setParameter("fullNamePart", "%" + fullNamePart + "%")
        .getResultList();
    }

    public void update(Teacher teacher) {
        entityManager.merge(teacher);
    }

    public void delete(Teacher teacher) {
        entityManager.remove(entityManager.merge(teacher));
    }

    public void deleteById(Long id) {
        Teacher teacher = findById(id);
        if (teacher != null) {
            entityManager.remove(teacher);
        }
    }

    @Transactional(readOnly = true)
    public List<Teacher> findByCourseId(Long courseId) {
        return entityManager.createQuery(
                "select ct.teacher " +
                "from CourseTeacher ct " +
                "where ct.course.id = :courseId " +
                "order by ct.teacher.fullName",
                Teacher.class
        )
        .setParameter("courseId", courseId)
        .getResultList();
    }

    @Transactional(readOnly = true)
    public List<Course> getCoursesByTeacherId(Long teacherId) {
        return entityManager.createQuery(
                "select ct.course " +
                "from CourseTeacher ct " +
                "where ct.teacher.id = :teacherId " +
                "order by ct.course.title",
                Course.class
        )
        .setParameter("teacherId", teacherId)
        .getResultList();
    }

    @Transactional(readOnly = true)
    public List<Teacher> findByCompanyId(Long companyId) {
        return entityManager.createQuery(
                "select t from Teacher t " +
                "where t.company.id = :companyId " +
                "order by t.fullName",
                Teacher.class
        )
        .setParameter("companyId", companyId)
        .getResultList();
    }
}