1. 程式人生 > 其它 >jpa多表關聯條件查詢實現

jpa多表關聯條件查詢實現

技術標籤:Java開發javajpa

通過實體類對映實現多表關聯條件查詢

jpa對於多表關聯可以在實體類中進行關聯對映,一對一用@OneToOne,一對多用@OneToMany,多對多用@ManyToMany,多對一用@ManyToOne,具體實體類配置就不多說了,然後對於條件查詢採用Specification物件進行封裝,如下

Specification<A> specification = new Specification<A>() {
        @Override
        public Predicate toPredicate(Root<
A>
root, CriteriaQuery<?> query, CriteriaBuilder cb) { //建立查詢條件集合 List<Predicate> orlist = new ArrayList<Predicate>(); //判斷是否模糊查詢 if (StringUtils.isNotBlank(key)){ //新增查詢條件 cb.like:模糊查詢 root.get("查詢欄位").as(型別.class)
orlist.add(cb.like(root.get("name").as(String.class),"%"+ key + "%")); orlist.add(cb.like(root.get("phone").as(String.class), "%"+ key + "%")); orlist.add(cb.like(root.get("role")
.as(String.class),"%"+ key + "%")); //建立左外連線 Join<左,右> root.join("副表實體在主表主體中的屬性名",連線方式) Join<A,B> join = root.join("b", JoinType.LEFT); //將連線表需要查詢的欄位寫入 orlist.add(cb.like(join.get("post").as(String.class),"%"+key+"%")); } return cb.or(orlist.toArray(new Predicate[orlist.size()])); } };

通過@Query(value=“sql語句”)方式實現表關聯查詢

建立ARepository介面然後繼承JpaRepository和JpaSpecificationExecutor,然後在repository介面中編寫查詢方法,如下

public interface ARepository extends JpaRepository<A,String> , JpaSpecificationExecutor<A> {

	@Query(value="SELECT * " +
            "FROM A_table a " +
            "LEFT JOIN B_table b ON a.b_unid = b.unid " +
            "LEFT JOIN C_table c ON a.c_unid = c.unid " +
            "WHERE a.delete_flag = 0 " +
            "AND (?1 is null or ?1='' or a.b_unid = ?1 )" +
            "AND (?2 is null or ?2='' or a.c_unid = ?2 ) " +
            "AND (?3 is null or ?3='' or a.created_time >= ?3 ) " +
            "ORDER BY fqcm.created_time DESC",nativeQuery = true)
    List<Map> selectABC(String bUnid, String cUnid, String createdTimeStart);
 }

@Query中?!,?2,?3代表傳遞的引數,應和下邊方法中的引數順序保持一致,其中條件

AND (?1 is null or ?1='' or a.b_unid = ?1 )

表示引數如果為空字串或者null時條件不生效,不為空字串和null時條件生效。
nativeQuery = true 表示可以執行原生的sql語句。

結束語

以上是自己在做jpa多表關聯是使用的方法,做一下記錄。