jpa實現多對多的屬性時查詢的兩種方法
jpa多對多的屬性查詢
第一:采用JPQL方式
使用@Query拼接jpql語句完成多對多的查詢;
@query( SELECT User FROM User u JOIN Student s on s.id = u.id where u.name LIKE :name ) User findallByName(@param(“name”)String name);
第二:采用specification 方法
user中有List<student>屬性,多對多的關系;
代碼如下:
Specification<Class> specification = new Specification<>(){
@override
public predicate toPredicate(Root<Class> root , CriteriaQuery<?> query ,CriteriaBuilder cb){
List<Precidate> precidate = Lists.newArrayList<>();
if(num>0){
Predicate p1 = cb.equal(root.get("num").as(Integer.Class),count);
precidate.add(p1);
}
if(channel > 0){
ListJoin<User,Student> join= root.join(root.getModel().getList("student",student.class),JoinType.LEFT);
Predicate p2 = cb.equal(join.get("id").as(Integer.Class));
//這里面的join代表的是student,屬于加入進來的部分,而不是鏈接表的全部結果;
precidate.add(p2);
}
List<User> list = DAO.findAll(specification,new Sort(DESC,"id"));
}
}
JPA,HQL多對多的查詢語句
一個老師教許多學生,一個學生被許多老師教,一個學生有好多書,同一種書被許多同學擁有.
要查詢教擁有書"a"的學生的老師!
Hql語句
SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a'
解釋:t.students s中s并不是集合的意思,而是t的students對象的表別名,join t.students s這個hql,hibernate會翻譯成兩個表的內連接關系
錯誤寫法:
SELECT t FROM teacher t where t.students.books.name = 'a'
其實道理是很顯然的,t.students是一個Set,那么這個Set怎么可能有books這樣的屬性呢?同理books.name也不對,所以使用表間連接并給出別名t.students s,此時的對象s才有books屬性,所以可以寫s.books b,最后使用b.name限制查詢b.name = 'a'.
另外一種寫法
SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
這種方法沒有出錯!不過這種方式要用子查詢!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于CyclicBarrier和CountDownLatch的使用區(qū)別說明
這篇文章主要介紹了基于CyclicBarrier和CountDownLatch的使用區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
解決@Autowired注入空指針問題(利用Bean的生命周期)
這篇文章主要介紹了解決@Autowired注入空指針問題(利用Bean的生命周期),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Springboot mybatisplus如何解決分頁組件IPage失效問題
這篇文章主要介紹了Springboot mybatisplus如何解決分頁組件IPage失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringCloud @FeignClient注入Spring容器原理分析
本文詳細分析了Spring Boot中@FeignClient注解的掃描和注入過程,重點探討了@EnableFeignClients注解的工作原理,通過源碼分析,揭示了@EnableFeignClients如何通過@Import注解和FeignClientsRegistrar類實現bean定義的加載2024-12-12

