Chapter 16. Advanced query options

 

In this chapter

  • Transforming query results
  • Filtering collections
  • Query-by-criteria with the Hibernate API

This chapter explains query options that you may consider optional or advanced: transforming query results, filtering collections, and the Hibernate criteria query API. First, we discuss Hibernate’s ResultTransformer API, with which you can apply a result transformer to a query result to filter or marshal the result with your own code instead of Hibernate’s default behavior.

In previous chapters, we always advised you to be careful when mapping collections, because it’s rarely worth the effort. In this chapter, we introduce collection filters, a native Hibernate feature that makes persistent collections more valuable. Finally, we look at another proprietary Hibernate feature, the org.hibernate.Criteria query API, and some situations when you might prefer it to the standard JPA query-by-criteria.

Let’s start with the transformation of query results.

16.1. Transforming query results

 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

Session session = em.unwrap(Session.class);
org.hibernate.Query query = session.createQuery(
    "select i.id as itemId, i.name as name, i.auctionEnd as auctionEnd from Item i"
);
 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

List<Object[]> result = query.list();
<enter/>
for (Object[] tuple : result) {
    Long itemId = (Long) tuple[0];
    String name = (String) tuple[1];
    Date auctionEnd = (Date) tuple[2];
    // ...
}
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

query.setResultTransformer(
    ToListResultTransformer.INSTANCE
);
<enter/>
List<List> result = query.list();
<enter/>
for (List list : result) {
    Long itemId = (Long) list.get(0);
    String name = (String) list.get(1);
    Date auctionEnd = (Date) list.get(2);
    // ...
}
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

org.hibernate.Query entityQuery = session.createQuery(
    "select i as item, u as seller from Item i join i.seller u"
);
<enter/>
entityQuery.setResultTransformer(
    AliasToEntityMapResultTransformer.INSTANCE
);
<enter/>
List<Map> result = entityQuery.list();
<enter/>
for (Map map : result) {
    Item item = (Item) map.get("item");
    User seller = (User) map.get("seller");
<enter/>
    assertEquals(item.getSeller(), seller);
    // ...
}
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

query.setResultTransformer(
    new AliasToBeanResultTransformer(ItemSummary.class)
);
<enter/>
List<ItemSummary> result = query.list();
<enter/>
for (ItemSummary itemSummary : result) {
    Long itemId = itemSummary.getItemId();
    String name = itemSummary.getName();
    Date auctionEnd = itemSummary.getAuctionEnd();
    // ...
}
 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

 
 
 
 

16.2. Filtering collections

 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/FilterCollections.java

Item item = em.find(Item.class, ITEM_ID);
User user = em.find(User.class, USER_ID);
<enter/>
org.hibernate.Query query = session.createFilter(
    item.getBids(),
    "where this.bidder = :bidder order by this.amount desc"
);
<enter/>
query.setParameter("bidder", user);
List<Bid> bids = query.list();
 
 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/FilterCollections.java

 
 

16.3. The Hibernate criteria query API

 
 
 

Path: /examples/src/test/java/org/jpwh/test/querying/advanced/HibernateCriteria.java

 
 
 
sitemap

Unable to load book!

The book could not be loaded.

(try again in a couple of minutes)

manning.com homepage
test yourself with a liveTest