JPA的@Query用法
文章目录@Query作用使用例子简单使用like表达式原生sql传参方式SPEL表达式nativeQuery 作用更新操作删除操作@query返回自定义字段@query返回自定义对象@Query作用@Query标记在继承了Repository的自定义接口方法上,就不需要遵循查询方法命名规则public @interface Query {/** 定义被执行的sql或者hql */String va
·
@Query作用
@Query标记在继承了Repository的自定义接口方法上,就不需要遵循查询方法命名规则
public @interface Query {
/** 定义被执行的sql或者hql */
String value() default "";
/** 分页时用于查询中数量的sql或者hql */
String countQuery() default "";
/** 用原生的分页 */
String countProjection() default "";
/** 使用原生sql,为false时使用hql */
boolean nativeQuery() default false;
/** 定义该查询的名字 */
String name() default "";
/** 数量查询返回的别名 */
String countName() default "";
}
使用例子
@Entity
@Table(name = "T_DEPT")
@Data
public class Dept implements Serializable {
@Id
private Integer id;
private String name;
private Integer upId;
}
@Entity
@Table(name = "T_USER")
@Data
public class User implements Serializable {
@Id
private Integer id;
private String name;
private Integer deptId;
}
简单使用
用占位符?
序号对应传入参数,从1开始
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select u.id, u.name from User u where u.id=?1")
List<User> getUserById(Integer id);
}
like表达式
用命名参数
@Query("select u.id, u.name from User u where u.name like %:name%")
List<User> getUserByName(@Param("name") String name);
原生sql
只能用占位符?
@Query(value="select u.id, u.name from t_user u where u.id=?1", nativeQuery = true)
List<User> getUserById(Integer id);
传参方式
- 占位符,序号对应参数声明顺序,从1开始
- 命名参数,@Param中声明传入参数名称
SPEL表达式
使用@Entity注解后,#{#entityName}会取@Entity()的值,默认是类名小写,可以申请如@Entity(name = “t_user”),取出的值就是t_user
@Query(value="select u.id, u.name from #{#entityName} u where u.id=?1", nativeQuery = true)
List<User> getUserById(Integer id);
nativeQuery 作用
nativeQuery 默认值为false,默认是使用hql语法, from对象
设置为true时,则使用原生sql, from表名
更新操作
添加@Modifying 注解
代表允许修改
@Modifying
@Query("update User u set u.name = :name where u.id = :id")
void update(@Param("id") Integer id, @Param("name") String name);
删除操作
添加@Modifying 注解
代表允许删除
@Modifying
@Query("delete from User where u.id = :id")
void update(@Param("id") Integer id);
@query返回自定义字段
hql和原生sql都可以实现
原生sql返回的是List<Object[]>
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select u.id, u.name, d.id, d.name " +
"from User u, Dept d " +
"where u.deptId=d.id", nativeQuery = true)
List<Object[]> findAllForUserDept();
@query返回自定义对象
使用的时hql语法,不支持sql原生
@Data
public class UserDept implements Serializable {
@JsonProperty("user_id")
private Integer userId;
@JsonProperty("user_name")
private String userName;
@JsonProperty("dept_id")
private Integer deptId;
@JsonProperty("dept_name")
private String deptName;
public UserDept(Integer userId, String userName, Integer deptId, String deptName) {
this.userId = userId;
this.userName = userName;
this.deptId = deptId;
this.deptName = deptName;
}
}
from 后面都是用的对象(hql)
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select new com.ljw.test.pojo.domain.UserDept(" +
"u.id, u.name, d.id, d.name ) " +
"from User u, Dept d " +
"where u.deptId=d.id")
List<UserDept> findAllForUserDept();
@Query("select new map(" +
"u.id as user_id, u.name as user_name, d.id as dept_id, d.name as dept_name) " +
"from User u, Dept d " +
"where u.deptId=d.id")
List<Map<String, Object>> findAllForMap();
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)