jpa多表關聯條件查詢實現
阿新 • • 發佈:2020-12-24
通過實體類對映實現多表關聯條件查詢
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多表關聯是使用的方法,做一下記錄。