*可使用JPA的NamedQueries,方法以下:
1:在實體類上使用@NamedQuery,示例以下:
@NamedQuery(name = "UserModel.findByAge",query = "select o from UserModel o where o.age >= ?1")
注:定義多個時使用下面的註解
@NamedQueries(value = {
@NamedQuery(name = User.QUERY_FIND_BY_LOGIN,
query = "select u from User u where u." + User.PROP_LOGIN
+ " = :username"),
@NamedQuery(name = "getUsernamePasswordToken",
query = "select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u." + User.PROP_LOGIN
+ " = :username")})
2:在本身實現的DAO的Repository接口裏面定義一個同名的方法,示例以下:
public List<UserModel> findByAge(int age);
3:而後就可使用了,Spring會先找是否有同名的NamedQuery,若是有,那麼就不會按照接口定義的方法來解析。
*使用@Query
這種查詢能夠聲明在繼承JpaRepository接口方法中,能夠在自定義的查詢方法上使用@Query來指定該方法要執行的查詢語句,好比:
@Query("select o from UserModel o where o.uuid=?1")
public List<UserModel> findByUuidOrAge(int uuid);
注意:
1:方法的參數個數必須和@Query裏面須要的參數個數一致
2:若是是like,後面的參數須要前面或者後面加「%」,好比下面都對:
@Query("select o from UserModel o where o.name like ?1%")
public List<UserModel> findByUuidOrAge(String name);
@Query("select o from UserModel o where o.name like %?1")
public List<UserModel> findByUuidOrAge(String name);
@Query("select o from UserModel o where o.name like %?1%")
public List<UserModel> findByUuidOrAge(String name);
固然,這樣在傳遞參數值的時候就能夠不加‘%’了,固然加了也不會錯
n還可使用@Query來指定本地查詢,只要設置nativeQuery爲true,好比:
@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true)
public List<UserModel> findByUuidOrAge(String name);
注意:當前版本的本地查詢不支持翻頁和動態的排序
使用命名化參數,使用@Param便可,好比:
@Query(value="select o from UserModel o where o.name like %:nn")
public List<UserModel> findByUuidOrAge(@Param("nn") String name);
一樣支持更新類的Query語句,添加@Modifying便可,好比:
@Modifying
@Query(value="update UserModel o set o.name=:newName where o.name like %:nn")
public int findByUuidOrAge(@Param("nn") String name,@Param("newName") String newName);
注意:
1:方法的返回值應該是int,表示更新語句所影響的行數
2:在調用的地方必須加事務,沒有事務不能正常執行