springboot jpa自定義查詢

jpa系列:
springboot jpa使用
springboot jpa 關系注解和mappedBy
springboot jpa自定義查詢


@Query

以下語句均為hql

public interface UserRepository extends JpaRepository<User, Integer> {
    @Query(value = "select t from User t")
    User abcd();
}

使用@Query來指定hql語句,則方法名隨意,jpa將根據(jù)該注解進行查詢;你也可使用sql語句,只需注解中添加參數(shù)nativeQuery = true即可,但不建議這樣做,容易導致對象封裝出錯,也不利于跨平臺。

關于hql,其語法基本雷同sql。不同之處基本在于:
1.hql中使用類名取代表名,用類名.類成員名取代表名.列名。
from User中的User,這里不是指表名,而是類名。也可加上包名如com.example.User

2.hql類名建議不要省略。
自己測試時,hql直接用類成員username會報錯,改為user.username就可以,與其它教程的似乎有出入,這里作建議。

3.hql沒有*
上面例子等價于sql:select t.* from user as t,也就是hql中全選所有列的*不用寫也不能寫。注意hql和sql中as都是可省略的,不要忽略這點。


更新/刪除和使用形參

1.更新/刪除操作只需增加注解@Modifying

2.使用形參,有兩種方式:
法1:

    @Query(value = "select t from User t where t.username=?1 and t.id=?2")
    User abcd(String username,int id);

?1?2分別代指形參usernameid

法2:

    @Query(value = "select t from User t where t.id in :ids")
    User abcd(@Param("ids") int[] aaa);

形參加注解@Param,hql中用:ids指代。值得一提,當參數(shù)是數(shù)組時仍然可用,如例子。


返回類型

例子1:

    @Query(value = "select t.username from User t")
    List abcd(String username,int id);

例子為選擇username列的所有數(shù)據(jù)。注意泛型問題,這里相當于List<Object>。你也可使用String[]作返回類型,但實際可視作jpa調用List.toArray(new String[List.size()]),仍然有可能出現(xiàn)類型轉換錯誤。

例子2:

    @Query(value = "select t.id,t.username from User t")
    List abcd(String username,int id);

選擇兩列的所有數(shù)據(jù)。注意泛型問題,這里相當于List<Object[2]>。


Controller中直接查詢

問題:只想簡單執(zhí)行hql語句,不想去改動DAO層中接口的方法。
答:使用org.hibernate包的Session類和Query類。鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容