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 ProjectDependencies 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
|
|