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

banq發表於2019-02-09

當不能直接提取時,我們可以考慮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;
    }
}

相關文章