Close

JPA - JPQL Join With Single Valued Path Expression

Following example shows that a JOIN query can be executed for a single valued relationship (such as @OneToOne) as well (other than for collection based relationship).

@Entity
public class Employee {
    @Id
    @GeneratedValue
    private long id;
    private String name;
    @OneToOne(cascade = CascadeType.ALL)
    private Task task;
    .............
}
@Entity
public class Task {
    @Id
    @GeneratedValue
    private long id;
    private String description;
    private String supervisor;
    .............
}
public class ExampleMain {
    private static EntityManagerFactory entityManagerFactory =
            Persistence.createEntityManagerFactory("example-unit");

    public static void main(String[] args) {
        try {
            persistEmployees();
            executeQuery();
            executeQuery2();
        } finally {
            entityManagerFactory.close();
        }
    }

    public static void persistEmployees() {
        Task task1 = new Task("Coding", "Denise");
        Task task2 = new Task("Refactoring", "Rose");
        Task task3 = new Task("Designing", "Denise");

        Employee employee1 = Employee.create("Diana", task1);
        Employee employee2 = Employee.create("Mike", task2);
        Employee employee3 = Employee.create("Tim", task3);
        Employee employee4 = Employee.create("Jack", null);

        EntityManager em = entityManagerFactory.createEntityManager();
        em.getTransaction().begin();
        em.persist(employee1);
        em.persist(employee2);
        em.persist(employee3);
        em.persist(employee4);
        em.getTransaction().commit();
        em.close();
        System.out.println("-- Employee persisted --");
        System.out.println(employee1);
        System.out.println(employee2);
        System.out.println(employee3);
        System.out.println(employee4);
    }

    private static void executeQuery() {
        System.out.println("-- executing JOIN query --");
        EntityManager em = entityManagerFactory.createEntityManager();
        Query query = em.createQuery("SELECT DISTINCT e FROM Employee e INNER JOIN e.task t");
        List<Employee> resultList = query.getResultList();
        for (Employee employee : resultList) {
            System.out.println(employee.getName() + " - " + employee.getTask());
        }
        em.close();
    }

    private static void executeQuery2() {
        System.out.println("-- executing JOIN query with WHERE --");
        EntityManager em = entityManagerFactory.createEntityManager();
        Query query = em.createQuery("SELECT DISTINCT e FROM Employee e INNER JOIN e.task t "
                + "where t.supervisor='Denise'");
        List<Employee> resultList = query.getResultList();
        for (Employee employee : resultList) {
            System.out.println(employee.getName() + " - " + employee.getTask());
        }
        em.close();
    }
}
-- Employee persisted --
Employee{id=1, name='Diana', task=Task{id=2, description='Coding', supervisor='Denise'}}
Employee{id=3, name='Mike', task=Task{id=4, description='Refactoring', supervisor='Rose'}}
Employee{id=5, name='Tim', task=Task{id=6, description='Designing', supervisor='Denise'}}
Employee{id=7, name='Jack', task=null}
-- executing JOIN query --
Mike - Task{id=4, description='Refactoring', supervisor='Rose'}
Tim - Task{id=6, description='Designing', supervisor='Denise'}
Diana - Task{id=2, description='Coding', supervisor='Denise'}
-- executing JOIN query with WHERE --
Tim - Task{id=6, description='Designing', supervisor='Denise'}
Diana - Task{id=2, description='Coding', supervisor='Denise'}

Example Project

Dependencies and Technologies Used:

  • h2 1.4.197: H2 Database Engine.
  • hibernate-core 5.2.13.Final: The core O/RM functionality as provided by Hibernate.
    Implements javax.persistence:javax.persistence-api version 2.1
  • JDK 1.8
  • Maven 3.3.9

jpql-join-with-single-valued-path-expression Select All Download
  • jpql-join-with-single-valued-path-expression
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • Employee.java
          • resources
            • META-INF

    See Also