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
发表评论 取消回复