@Override @Transactional(readOnly = true) public T findOne(I id, List<String> embed) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<T> criteriaQuery = builder.createQuery(domainClass); Root<T> root = criteriaQuery.from(domainClass); criteriaQuery.where(builder.equal(root.get("id"), id)); TypedQuery<T> query = entityManager .createQuery(criteriaQuery) .setHint(QueryHints.HINT_LOADGRAPH, createEnitityGraph(embed)); List<T> resultList = query.getResultList(); if (CollectionUtils.isEmpty(resultList)) { return null; } return resultList.get(0); }
@Test public void testFetchSize() { int pageStart = 20; int pageSize = 50; doInJPA(entityManager -> { List<PostCommentSummary> summaries = entityManager.createQuery( "select new " + " com.vladmihalcea.book.hpjp.hibernate.fetching.PostCommentSummary( " + " p.id, p.title, c.review ) " + "from PostComment c " + "join c.post p") .setFirstResult(pageStart) .setMaxResults(pageSize) .setHint(QueryHints.HINT_FETCH_SIZE, pageSize) .getResultList(); assertEquals(pageSize, summaries.size()); }); }
@Test public void testStream() { List<Post> posts = doInJPA(entityManager -> { try(Stream<Post> postStream = entityManager .createQuery( "select p " + "from Post p " + "order by p.createdOn desc", Post.class) .setHint( QueryHints.HINT_FETCH_SIZE, 50 ) .unwrap(Query.class) .stream() ) { return postStream.limit( 50 ).collect( Collectors.toList() ); } }); assertEquals(50, posts.size()); }
@Test public void testStreamExecutionPlan() { List<Object[]> executionPlanLines = doInJPA(entityManager -> { try(Stream<Object[]> postStream = entityManager .createNativeQuery( "EXPLAIN ANALYZE " + "SELECT p " + "FROM post p " + "ORDER BY p.created_on DESC") .setHint( QueryHints.HINT_FETCH_SIZE, 50 ) .unwrap(Query.class) .stream() ) { return postStream.collect( Collectors.toList() ); } }); LOGGER.info( "Execution plan: {}", executionPlanLines .stream() .map( line -> (String) line[0] ) .collect( Collectors.joining( "\n" ) ) ); }
/** * CommonDAO 内部方法,NamedQuery * * @param entityManager * entityManager * @param name * name * @param cacheable * cacheable * @param cacheRegion * cacheRegion * @param values * values * @return Query对象 */ private Query createNamedQuery(EntityManager entityManager, String name, boolean cacheable, String cacheRegion, Map<String, Object> values) { Query query = entityManager.createNamedQuery(name.trim()); if (cacheable) { query.setHint(QueryHints.HINT_CACHEABLE, "true"); if (cacheRegion != null && (!cacheRegion.equals(""))) { query.setHint(QueryHints.HINT_CACHE_REGION, cacheRegion); } } if (values != null && values.size() > 0) { for (Entry<String, Object> e : values.entrySet()) { query.setParameter(e.getKey(), e.getValue()); } } return query; }
/** * CommonDAO 内部方法,Query * * @param entityManager * entityManager * @param jpql * jqpl * @param cacheable * cacheable * @param cacheRegion * cacheRegion * @param values * values * @return Query对象 */ private Query createQuery(EntityManager entityManager, String jpql, boolean cacheable, String cacheRegion, Map<String, Object> values) { Query query = entityManager.createQuery(jpql); if (cacheable) { query.setHint(QueryHints.HINT_CACHEABLE, "true"); if (cacheRegion != null && (!cacheRegion.equals(""))) { query.setHint(QueryHints.HINT_CACHE_REGION, cacheRegion); } } if (values != null && values.size() > 0) { for (Entry<String, Object> e : values.entrySet()) { query.setParameter(e.getKey(), e.getValue()); } } return query; }
@Test public void testReadOnly() { doInJPA(entityManager -> { List<Post> posts = entityManager.createQuery( "select p from Post p", Post.class) .setHint(QueryHints.HINT_READONLY, true) .getResultList(); }); }
public List<PostComment> getLatestPostComments(EntityManager entityManager) { return entityManager.createQuery( "select pc " + "from PostComment pc " + "order by pc.post.id desc", PostComment.class) .setMaxResults(10) .setHint(QueryHints.HINT_CACHEABLE, true) .getResultList(); }
private List<PostComment> getLatestPostCommentsByPostId(EntityManager entityManager) { return entityManager.createQuery( "select pc " + "from PostComment pc " + "where pc.post.id = :postId", PostComment.class) .setParameter("postId", 1L) .setMaxResults(10) .setHint(QueryHints.HINT_CACHEABLE, true) .getResultList(); }
private List<PostComment> getLatestPostCommentsByPost(EntityManager entityManager) { Post post = entityManager.find(Post.class, 1L); return entityManager.createQuery( "select pc " + "from PostComment pc " + "where pc.post = :post ", PostComment.class) .setParameter("post", post) .setMaxResults(10) .setHint(QueryHints.HINT_CACHEABLE, true) .getResultList(); }
private List<PostCommentSummary> getPostCommentSummaryByPost(EntityManager entityManager) { return entityManager.createQuery( "select new com.vladmihalcea.book.hpjp.hibernate.cache.QueryCacheTest$PostCommentSummary(pc.id, p.title, pc.review) " + "from PostComment pc " + "left join pc.post p " + "where p.id = :postId ", PostCommentSummary.class) .setParameter("postId", 1L) .setMaxResults(10) .setHint(QueryHints.HINT_CACHEABLE, true) .getResultList(); }
private void stream(EntityManager entityManager) { final AtomicLong sum = new AtomicLong(); try(Stream<Post> postStream = entityManager .createQuery("select p from Post p", Post.class) .setMaxResults(resultSetSize) .setHint(QueryHints.HINT_FETCH_SIZE, Integer.MIN_VALUE) .unwrap(Query.class) .stream()) { postStream.forEach(post -> sum.incrementAndGet()); } assertEquals(resultSetSize, sum.get()); }
protected Query createEntityQuery1(EntityManager entityManager) { return entityManager.createQuery( "select new " + " com.vladmihalcea.book.hpjp.hibernate.fetching.PostCommentSummary( " + " p.id, p.title, c.review ) " + "from PostComment c " + "join c.post p") .setFirstResult(10) .setMaxResults(20) .setHint(QueryHints.HINT_FETCH_SIZE, 20); }
protected Query createNativeQuery1(EntityManager entityManager) { return entityManager.createNativeQuery( "select p.id, p.title, c.review * " + "from post_comment c " + "join post p on p.id = c.post_id ") .setFirstResult(10) .setMaxResults(20) .setHint(QueryHints.HINT_FETCH_SIZE, 20); }
@Test public void testWithDistinctAndQueryHint() { doInJPA(entityManager -> { List<Post> posts = entityManager.createQuery( "select distinct p " + "from Post p " + "left join fetch p.comments " + "where p.title = :title", Post.class) .setParameter("title", "High-Performance Java Persistence") .setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false) .getResultList(); LOGGER.info("Fetched {} post entities: {}", posts.size(), posts); }); }
@SuppressWarnings("unchecked") @Override public List<T> getAllUsingCache(Pageable page) { Query query = entityManager.createQuery("from " + clazz.getName()); query.setHint(QueryHints.HINT_CACHEABLE, true); if (page != null) { query.setFirstResult(page.getPageNumber()*page.getPageSize()); query.setMaxResults(page.getPageSize()); } return query.getResultList(); }
@SuppressWarnings("unchecked") @Override public List<Country> getAll() { Query query = entityManager.createQuery("from Country"); //stores the query results in the second level cache (if enabled) query.setHint(QueryHints.HINT_CACHEABLE, true); return query.getResultList(); }