如何使用Hibernate/JPA的JPQL/HQL查询提取?


当不能直接提取时,我们可以考虑JPQL / HQL查询提取。
本文的应用程序展示如何通过JpaRepository,EntityManager和Session实现查询概念的证明。
关键点:

  • 对于JpaRepository, 使用@Query或Spring Data Query Creation
  • 对于EntityManager和Session, 使用该createQuery()方法

源代码可以在这里找到  

JpaRepository:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {  
    
    @Transactional(readOnly = true)
    List<User> findByName(String name);
    
    @Transactional(readOnly = true)
    @Query("select u from User u where u.name = ?1")
    List<User> fetchUsersByName(String name);
}

@Repository
@Transactional(readOnly = true)
public class Dao<T, ID extends Serializable> implements GenericDao<T, ID> {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<T> findByName(String name) {
        List<T> results = entityManager.
                createQuery("select u from User u where u.name=:name")
                .setParameter(
"name", name)
                .getResultList();

        return results;
    }

    @Override
    public List<T> findByNameViaSession(String name) {
        
        Session session = entityManager.unwrap(Session.class);        
        List<T> results = session.createQuery(
"select u from User u where u.name=:name")
                .setParameter(
"name", name)
                .list();
        
        return results;
    }
}