@Qurey注解的使用

一、参数的传递

  1. 使用?传递参数

    public interface UserRepository extends JpaRepository<User, Long> {
    	
        @Query("select u from User u where u.emailAddress = ?1")
        User findByEmailAddress(String emailAddress);
    }
    
  2. 使用:参数名传递参数

    public interface UserRepository extends JpaRepository<User, Long> {
      /**
      * :后的名字是通过 @Param 指定的变量名
      */
      @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
      User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                     @Param("firstname") String firstname);
    }
    

二、开启本地SQL查询

public interface UserRepository extends JpaRepository<User, Long> {
  /**
  * 设置 nativeQuery = true 来开启本地SQL查询
  */
  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

三、使用 SpEL 表达式

public interface UserRepository extends JpaRepository<User,Long> {
  /**
  * 其中的 entityName 是指实体中使用 @Entity 注解指定的表名,但不支持使用 orm.xml 配置文件指定。
  */
  @Query("select u from #{#entityName} u where u.lastname = ?1")
  List<User> findByLastname(String lastname);
}

四、使用@Qurey进行增删改

interface UserRepository extends Repository<User, Long> {
    /**
    * 使用 @Modifying 注解添加该方法对增删改的支持
    */
    @Modifying
    @Query("update User u set u.firstname = ?1 where u.lastname = ?2")
    int setFixedFirstnameFor(String firstname, String lastname);
}

参考资料:
Spring Data JPA - Reference Documentation

### 如何在 POST 请求中通过 Query 参数传递对象 在 HTTP 协议中,POST 请求通常用于向服务器提交数据,而数据可以通过请求体(body)或查询参数(query parameters)传递。尽管 POST 请求更常使用请求体来传递数据[^3],但也可以通过 URL 的查询参数传递数据。当需要通过查询参数传递对象时,可以将对象序列化为字符串形式,并将其附加到 URL 中。 以下是实现这一目标的详细说明和示例代码: #### 数据格式化方式 为了通过查询参数传递对象,通常需要将对象转换为键值对的形式。常见的做法是使用 URL 编码(URL Encoding),即通过 `application/x-www-form-urlencoded` 格式表示对象的属性和值。例如,一个对象 `{name: "John", age: 30}` 可以被编码为 `name=John&age=30` 并附加到 URL 的查询参数部分。 另一种方法是将对象序列化为 JSON 字符串,并直接作为查询参数传递。例如,`{name: "John", age: 30}` 可以被编码为 `data=%7B%22name%22%3A%22John%22%2C%22age%22%3A30%7D`,其中 `%7B` 和 `%7D` 分别表示 `{` 和 `}` 的 URL 编码[^1]。 #### 示例代码 以下是一个使用 JavaScript 和 Axios 库实现的示例代码,展示如何在 POST 请求中通过查询参数传递对象: ```javascript const axios = require('axios'); // 定义要传递的对象 const obj = { name: "John", age: 30 }; // 将对象序列化为 URL 编码的字符串 const params = new URLSearchParams(); for (const key in obj) { if (obj.hasOwnProperty(key)) { params.append(key, obj[key]); } } // 发送 POST 请求 axios.post('https://example.com/api', null, { params: params // 使用 params 属性传递查询参数 }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 如果需要将对象序列化为 JSON 字符串并通过查询参数传递,可以使用以下代码: ```javascript const axios = require('axios'); // 定义要传递的对象 const obj = { name: "John", age: 30 }; // 将对象序列化为 JSON 字符串并进行 URL 编码 const encodedData = encodeURIComponent(JSON.stringify(obj)); // 发送 POST 请求 axios.post(`https://example.com/api?data=${encodedData}`, null) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` #### 注意事项 - 在 POST 请求中,虽然可以使用查询参数传递数据,但通常推荐将数据放在请求体中,以保持 URL 的简洁性[^3]。 - 如果选择通过查询参数传递复杂对象,需确保对象被正确序列化和编码,以避免特殊字符导致的解析问题[^1]。 - 查询参数的长度可能受到浏览器或服务器的限制,因此不建议通过查询参数传递大量数据[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值