import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
 
import com.zwg.demo.model.MUser;
 
@Repository
//public interface UserRepository extends CrudRepository<User, Long> {
public interface UserRepository extends PagingAndSortingRepository<MUser, Long> {
     
    /*
        框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。
 
        在创建查询时,我们通过在方法名中使用属性名称来表达,比如 findByUserAddressZip ()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型):
         
        先判断 userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
        从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为 AccountInfo 的一个属性;
        接着处理剩下部分( AddressZip ),先判断 user 所对应的类型是否有 addressZip 属性,如果有,则表示该方法最终是根据 "AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 "AccountInfo.user.address.zip" 的值进行查询。
        在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
         
        And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
        Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
        Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
        LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
        GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
        IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
        IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
        NotNull --- 与 IsNotNull 等价;
        Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
        NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
        OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
        Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);
        In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
        NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
     */
    //根据方法名查询
    public MUser findByName(String name);
    //分页排序查询  page从0开始
    public Page<MUser> findByName(String name, Pageable pageable);
     
    //根据JPSQL查询
    //表名称 必须使用类名称   sql语句结尾不能加 ;号
    //select 不能使用*
    //@Query("from MUser where email=:email")
    //@Query("select u from MUser u where u.email=:email")
    //public User getBySql(@Param("email")String email);
    //@Query(value="select new com.zwg.demo.model.MUser1(id,name) from MUser where email=?1")
    //public MUser1 getBySql(String email);
    @Query(value="select new com.zwg.demo.model.MUser(id,name) from MUser where email=?1")
    public MUser getBySql(String email);
    //根据自然的SQL查询
    //自然查询语句 表面是数据的名字 可以使用 *
    //@Query(value="select * from user where email=:email",nativeQuery=true)
    //@Query(value="select id,name, "" as email,"" as password from user where email=?1",nativeQuery=true)
    //public User getBySql(@Param("email")String email);
     
    /*
     @NamedQuery(或 @NamedNativeQuery)定义好查询语句,唯一要做的就是为该语句命名时,需要满足”DomainClass.methodName()”的命名规则。
     */
    //根据NamedQuery查询 
    //public MUser getBySql(String email);
}

联表查询多表数据

public class UserGroup implements Serializable {
 
    private static final long serialVersionUID = -7367871287146067764L;
 
    @Id
    @GeneratedValue
    private Integer id;
    @Column(name = "group_name",length = 64)
    private String groupName;
}
 
 
public class UserA implements Serializable {
 
    private static final long serialVersionUID = -7367871287146067764L;
 
    @Id
    @GeneratedValue
    private Integer id;
    @Column(name = "last_name",length = 64)
    private String lastName;
    @Column(name = "first_name", length = 64)
    private String firstName;
    @Column(name = "group_id")
    private int groupId;
 
}
 
public class UserB {
 
    private UserA userA;
    private UserGroup group;
}
 
 
public interface UserARepository extends PagingAndSortingRepository<UserA,Integer> {
 
 
    //@Query(value = "select a from UserA a join UserGroup g on a.groupId=g.id where g.id=1")
    @Query(value = "select a.* from User_A a join User_Group g on a.group_id=g.id where g.id=1",nativeQuery = true)
    List<UserA> getUserInfo();
 
//    @Query(value = "select a from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
//    List<UserA> getUserInfo();
 
    @Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
    List<UserB> getUserBInfo();
 
    @Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
    Page<UserB> getUserBInfo(Pageable page);
}
出自:https://my.oschina.net/skyzwg/blog/1512340