JPA對MySql進行leftjoin查詢


JPA對數據庫表進行簡單的增刪改查非常簡單,大多數情況下使用JpaRepository的函數就可以達到目的。

有時我們也會做一些復雜的條件查詢,只需在函數上一行添加@Query()也能達到目的。

@Repository()
public interface ApplicationRepository extends JpaRepository<ApplicationDTO, Integer>{
    // 模糊查詢
    @Query("select u from ApplicationDTO u where (u.state = ?1 OR ?1 IS NULL)")
    List<ApplicationDTO> findByState(Integer state);

    // 模糊查詢
    @Query("select u from ApplicationDTO u where (u.state = ?1 OR ?1 IS NULL)")
    Page<ApplicationDTO> findByState(Integer state, Pageable pageable);
}

但如果我們要做一些聚合查詢,例如left join,就會遇到麻煩。

JpaRepository要求添加實體泛型,如JpaRepository<ApplicationDTO, Integer>。聚合查詢時多張表關聯查詢,返回的數據類型不能定義成@Entity,該注解是與數據庫表直接映射的;數據類型不定義@Entity又會在啟動時報錯。

使用javax.persistence.EntityManager手動創建查詢可以避免上面問題。下面以left join為例:

private List<TenantApp> getApp() {
        EntityManager entityManager = BeanFactory.getBean(EntityManager.class);
        Query query = entityManager.createNativeQuery("select a.app_name, t.project_name, a.app_identifier from t_application a left join t_project t on a.project_id = t.id");
        List<Object[]> list = query.getResultList();
        return list.stream().map( arr -> {
            Application app = new Application();
            app.setAppName(String.valueOf(arr[0]));
            app.setProjectName(String.valueOf(arr[1]));
            app.setAppIdentifier(String.valueOf(arr[2]));
            return app;
        }).collect(Collectors.toList());
    } 

其中BeanFactory代碼如下

@Component
public class BeanFactory implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        // TODO Auto-generated method stub
        BeanFactory.applicationContext = arg0;
    }
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }
    
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM