當我們使用方法名稱很難,達到預期的查詢結果,就可以使用@Query進行查詢,@Query是一種添加自定義查詢的便利方式
(方法名稱查詢見http://blog.csdn.net/niugang0920/article/details/79426521)
使用@Query注解,使用注解有兩種方式,一種是JPQL的SQL語言方式,一種是原生SQL的語言.
1.User.java 實體類
-
package com.niugang.entity;
-
import javax.persistence.Column;
-
import javax.persistence.Entity;
-
import javax.persistence.GeneratedValue;
-
import javax.persistence.GenerationType;
-
import javax.persistence.Id;
-
import javax.persistence.Table;
-
//javax.persistence.Entity
-
-
-
public class User {
-
/**
-
*mysql 自定生成主鍵
-
*指示持久性提供者必須分配使用數據庫標識列的實體的主鍵
-
*/
-
-
-
-
private Integer id;
-
/**
-
* @Column中的name默認和字段名相同
-
*/
-
-
private String name;
-
-
private Integer age;
-
-
private String phone;
-
-
-
private String password;
-
-
public String getPassword() {
-
return password;
-
}
-
public void setPassword(String password) {
-
this.password = password;
-
}
-
public Integer getId() {
-
return id;
-
}
-
public void setId(Integer id) {
-
this.id = id;
-
}
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public Integer getAge() {
-
return age;
-
}
-
public void setAge(Integer age) {
-
this.age = age;
-
}
-
public String getPhone() {
-
return phone;
-
}
-
public void setPhone(String phone) {
-
this.phone = phone;
-
}
-
-
public String toString() {
-
return "User [id=" + id + ", name=" + name + ", age=" + age + ", phone=" + phone + ", password=" + password
-
+ "]";
-
}
-
-
}
2.UserDao.java
-
package com.niugang.dao;
-
import java.util.List;
-
import org.springframework.data.domain.Page;
-
import org.springframework.data.domain.Pageable;
-
import org.springframework.data.jpa.repository.JpaRepository;
-
import org.springframework.data.jpa.repository.Query;
-
import org.springframework.data.repository.query.Param;
-
import org.springframework.stereotype.Repository;
-
import com.niugang.entity.User;
-
/**
-
* JpaRepository springboot已經自動配置了,也已經注入數據源了
-
*
-
* @author niugang
-
*
-
*/
-
-
public interface UserDao extends JpaRepository<User, Integer> {
-
/**
-
* ?加數字表示占位符,?1代表在方法參數里的第一個參數,區別於其他的index,這里從1開始
-
*/
-
// select * from User where name = ?1 注意不能寫成*
-
-
User findUserByName1(String name);
-
-
-
/**
-
* =:加上變量名,這里是與方法參數中有@Param的值匹配的,而不是與實際參數匹配的 和上面第一個原理是一樣的
-
*/
-
-
-
User findUserByName2(@Param("name") String username);
-
-
/**
-
* 通過原生sql 進行查詢
-
* 開啟nativeQuery=true,在value里可以用原生SQL語句完成查詢
-
*/
-
-
User findUserByNativeSQL(@Param("name") String username);
-
-
-
/**
-
* 模糊查詢 這里的%只能放在占位的前面,后面不行
-
*/
-
-
List<User> findUserLike(String name);
-
-
-
/**
-
* 調條件分頁查詢 Pageable:spring-data-jpa自帶接口
-
*
-
* @param name
-
* :查詢條件name
-
* @param page:分頁對象
-
* @return
-
*/
-
-
-
Page<User> findUserLikeByPage(String name, Pageable page);
-
-
/**
-
* @Query查詢不支持,排序並且分頁
-
* 源碼分析
-
* if (hasParameterOfType(method, Pageable.class)) {
-
-
-
if (!isStreamQuery()) {
-
assertReturnTypeAssignable(method, Slice.class, Page.class, List.class);
-
}
-
-
-
if (hasParameterOfType(method, Sort.class)) {
-
throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. "
-
+ "Use sorting capabilities on Pageble instead! Offending method: %s", method.toString()));
-
}
-
}
-
*
-
* @param sort :排序對象 org.springframework.data.domain.Sort
-
* @return
-
*/
-
-
List<User> findUserLikeBySort(Sort sort);
-
-
}
3. findUserLikeByPage(String name, Pageable page)接口解釋:
-
public Page<User> findUserByPage(String name) {
-
PageRequest pageRequest = new PageRequest(0, 4);
-
return userDao.findUserLikeByPage(name, pageRequest);
-
-
}
4.排序測試代碼
-
/**
-
* 單條件排序
-
*/
-
public List<User> findListSortSingleCondition(){
-
//id升序查詢
-
Sort sort = new Sort(Sort.Direction.ASC,"id");
-
return userDao.findUserLikeBySort(sort);
-
}
-
/**
-
* 多條件排序
-
*/
-
public List<User> findListSortMultiCondition(){
-
List<Order> orders= new ArrayList<Order>();
-
Order orderId = new Sort.Order(Sort.Direction.DESC,"id");
-
Order orderAge = new Sort.Order(Sort.Direction.DESC,"age");
-
orders.add(orderId);
-
orders.add(orderAge);
-
Sort sort = new Sort(orders);
-
return userDao.findUserLikeBySort(sort);
-
}