📜  Spring Boot 中的手动自定义查询 (1)

📅  最后修改于: 2023-12-03 15:05:15.892000             🧑  作者: Mango

Spring Boot 中的手动自定义查询

在 Spring Boot 中,我们可以通过实现自定义查询方法来轻松地与数据库进行交互。通过使用 Spring Data JPA 等持久化框架,我们可以更方便地实现这一目标。

不过,有时候我们需要自己构建查询语句,来进行一些更为复杂的查询操作。这时,我们就需要手动自定义查询。

自定义查询方法

在 Spring Boot 中,我们可以通过在 Repository 接口中定义自定义查询方法,来实现与数据库的交互。这些方法通常是以 findByfindAllBycountBydeleteBy 等关键字开头,后跟属性名和可选条件。

UserRepository 为例,定义一个 findByUsernameAndEmail 方法:

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsernameAndEmail(String username, String email);
}

其中,User 是实体类,Long 是其主键类型。该方法将返回一个 User 对象,其中 usernameemail 分别匹配参数传入的值。

以上就是最简单的自定义查询方法,它可以很好地适用于简单的查询需求。但是,当需要进行更复杂的查询操作时,我们需要手动自定义查询语句。

手动自定义查询语句

手动自定义是在 @Query 注解内定义原生 SQL 语句来执行自定义查询。该注解用于表示该方法使用 SQL 命令进行数据获取。定义一个查询用户名和邮箱的方法:

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("select u from User u where u.username = ?1 and u.email = ?2")
    User findUser(String username, String email);
}

在上面的示例中,@Query 注解包含一个 SQL 语句,其中 ?1?2 分别表示第一个和第二个参数。使用这种方式来自定义查询语句,可以实现更为复杂的查询操作。

除了 @Query 注解,还有 @NamedQuery 注解,该注解表示该查询语句已提前在实体类中定义,只需通过 @NamedQuery 中 name 找到就可以使用。

@Entity
@NamedQuery(name = "User.findUserByName", query = "SELECT u FROM User u WHERE u.username LIKE %:name%")
public class User {

    // other fields and methods
    
}

然后在 UserRepository 中加入以下方法:

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findUserByName(@Param("name") String name);
}

其中,@Param("name") 是传入的参数名称。

到这里,我们已经介绍了在 Spring Boot 中实现手动自定义查询的方法。通过自定义查询方法,我们可以更灵活地与数据库进行交互,完成更多更复杂的查询操作。