JPA的@Query用法

@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. 占位符,序号对应参数声明顺序,从1开始
  2. 命名参数,@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();
}
  • 16
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值