Close

JPA - Using KEY, VALUE and ENTRY keywords to access Map Entity Relationship in JPQL

Following example shows how to navigate Map association using keywords KEY, VALUE and ENTRY in JPQL.

Example

Entities

@Entity
public class Customer {
  @Id
  @GeneratedValue
  private int id;
  private String name;
  @OneToMany(cascade = CascadeType.ALL)
  private Map<String, Order> orderMap;
    .............
}
@Entity
@Table(name="CustomerOrder")
public class Order {
  @Id
  @GeneratedValue
  private long id;
  private String item;
  private int qty;
    .............
}

Navigating map

public class ExampleMain {

  public static void main(String[] args) {
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
      try {
          persistEntity(emf);
          findItemQty(emf);
          findOrderMapEntry(emf);
          findCustomerByItemName(emf);
      } finally {
          emf.close();
      }
  }

  private static void persistEntity(EntityManagerFactory emf) {
      System.out.println("-- Persisting entities --");
      EntityManager em = emf.createEntityManager();

      Customer c1 = new Customer();
      c1.setName("Lindsey Craft");
      c1.addOrder("online", "XYZ Blender", 2);
      c1.addOrder("store", "ZZZ Beer Glass", 4);
      System.out.println(c1);

      Customer c2 = new Customer();
      c2.setName("Morgan Philips");
      c2.addOrder("online", "AA Glass Cleaner", 3);
      System.out.println(c2);

      em.getTransaction().begin();
      em.persist(c1);
      em.persist(c2);
      em.getTransaction().commit();
      em.close();
  }

  private static void findItemQty(EntityManagerFactory emf) {
      System.out.println("-- Finding items and keys --");
      EntityManager em = emf.createEntityManager();
      TypedQuery<Tuple> query =
              em.createQuery("SELECT c.name, KEY(map), VALUE(map).item, VALUE(map).qty "
                      + "FROM Customer c JOIN c.orderMap map", Tuple.class);
      query.getResultList().forEach(
              t -> System.out.printf("Customer: %s, Order-Type: %s, Order-item: %s, Order-qty: %s%n",
                      t.get(0), t.get(1), t.get(2), t.get(3)));
  }

  private static void findOrderMapEntry(EntityManagerFactory emf) {
      System.out.println("-- Finding item/keys entries  --");
      EntityManager em = emf.createEntityManager();
      TypedQuery<Map.Entry> query =
              em.createQuery("SELECT ENTRY(c.orderMap) FROM Customer c", Map.Entry.class);
      query.getResultList().forEach(entry -> System.out.printf("Order-Type: %s, Order: %s%n",
              entry.getKey(), entry.getValue()));
  }

  private static void findCustomerByItemName(EntityManagerFactory emf) {
      System.out.println("-- Finding  customers where item name like %Beer% --");
      EntityManager em = emf.createEntityManager();
      TypedQuery<Customer> query =
              em.createQuery("SELECT c FROM Customer c"
                      + " WHERE VALUE(c.orderMap).item LIKE '%Beer%'", Customer.class);
      query.getResultList().forEach(System.out::println);
  }
}
-- Persisting entities --
Customer{id=0, name='Lindsey Craft', orderMap={online=Order{id=0, item='XYZ Blender', qty=2}, store=Order{id=0, item='ZZZ Beer Glass', qty=4}}}
Customer{id=0, name='Morgan Philips', orderMap={online=Order{id=0, item='AA Glass Cleaner', qty=3}}}
-- Finding items and keys --
Customer: Lindsey Craft, Order-Type: online, Order-item: XYZ Blender, Order-qty: 2
Customer: Lindsey Craft, Order-Type: store, Order-item: ZZZ Beer Glass, Order-qty: 4
Customer: Morgan Philips, Order-Type: online, Order-item: AA Glass Cleaner, Order-qty: 3
-- Finding item/keys entries --
Order-Type: online, Order: Order{id=2, item='XYZ Blender', qty=2}
Order-Type: store, Order: Order{id=3, item='ZZZ Beer Glass', qty=4}
Order-Type: online, Order: Order{id=5, item='AA Glass Cleaner', qty=3}
-- Finding customers where item name like %Beer% --
Customer{id=1, name='Lindsey Craft', orderMap={online=Order{id=2, item='XYZ Blender', qty=2}, store=Order{id=3, item='ZZZ Beer Glass', qty=4}}}

Example Project

Dependencies and Technologies Used:

  • h2 1.4.197: H2 Database Engine.
  • hibernate-core 5.3.5.Final: Hibernate's core ORM functionality.
    Implements javax.persistence:javax.persistence-api version 2.2
  • JDK 1.8
  • Maven 3.5.4

jpql-using-key-value-entry-for-map-entity-relationship Select All Download
  • jpql-using-key-value-entry-for-map-entity-relationship
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ExampleMain.java
          • resources
            • META-INF

    See Also