jpa實現(xiàn)多對多的屬性時查詢的兩種方法
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>屬性,多對多的關(guān)系;
代碼如下:
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,屬于加入進來的部分,而不是鏈接表的全部結(jié)果; precidate.add(p2); } List<User> list = DAO.findAll(specification,new Sort(DESC,"id")); } }
JPA,HQL多對多的查詢語句
一個老師教許多學(xué)生,一個學(xué)生被許多老師教,一個學(xué)生有好多書,同一種書被許多同學(xué)擁有.
要查詢教擁有書"a"的學(xué)生的老師!
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會翻譯成兩個表的內(nèi)連接關(guān)系
錯誤寫法:
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)
這種方法沒有出錯!不過這種方式要用子查詢!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中@ConditionalOnProperty的使用及作用詳解
這篇文章主要介紹了SpringBoot中@ConditionalOnProperty的使用及作用詳解,@ConditionalOnProperty通過讀取本地配置文件中的值來判斷 某些 Bean 或者 配置類 是否加入spring 中,需要的朋友可以參考下2024-01-01解決日期轉(zhuǎn)化Json異常- Date JSON parse error
這篇文章主要介紹了解決日期轉(zhuǎn)化Json異常- Date JSON parse error問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Spark學(xué)習(xí)筆記之Spark中的RDD的具體使用
這篇文章主要介紹了Spark學(xué)習(xí)筆記之Spark中的RDD的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06SpringBoot?集成Resteasy實現(xiàn)RESTFul接口的詳細過程
這篇文章主要介紹了SpringBoot集成Resteasy實現(xiàn)RESTFul接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08