jpa的projection各个用法案例
时间: 2023-07-13 14:28:40 浏览: 141
JPA的Projection是一种用于查询结果集的机制,用于选择实体类的部分属性或者聚合函数的返回结果,以满足不同的业务需求。下面是几个Projection的用法案例:
1.选择实体类的部分属性
```java
public interface UserProjection {
String getName();
Integer getAge();
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<UserProjection> findByName(String name);
}
```
这段代码中,UserProjection是一个接口,其中定义了需要查询的实体属性的getter方法。在UserRepository中,调用findByName方法时,返回的是UserProjection类型的List集合,其中只包含了name和age两个属性。
2.使用构造函数表达式
```java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT new com.example.demo.projection.UserProjection(u.name, u.age) FROM User u WHERE u.name = ?1")
List<UserProjection> findByName(String name);
}
public class UserProjection {
private String name;
private Integer age;
public UserProjection(String name, Integer age) {
this.name = name;
this.age = age;
}
// getters and setters
}
```
这段代码中,使用构造函数表达式创建UserProjection对象,可以查询实体类的部分属性或者聚合函数的返回结果。同时也可以在查询结果中添加计算字段,例如:`SELECT new com.example.demo.projection.UserProjection(u.name, u.age+1) FROM User u WHERE u.name = ?1`。
3.使用@Value注解
```java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u.name AS name, u.age AS age FROM User u WHERE u.name = ?1")
List<UserProjection> findByName(String name);
}
public interface UserProjection {
@Value("#{target.name}")
String getName();
@Value("#{target.age}")
Integer getAge();
}
```
这段代码中,使用@Value注解从查询结果中获取实体属性的值,可以查询实体类的部分属性或者聚合函数的返回结果。同时也可以在查询结果中添加计算字段,例如:`SELECT u.name AS name, u.age+1 AS age FROM User u WHERE u.name = ?1`。
4.使用接口默认方法
```java
public interface UserProjection {
String getName();
Integer getAge();
default String getFullName() {
return getName() + "(" + getAge() + ")";
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<UserProjection> findByName(String name);
}
```
这段代码中,定义了UserProjection接口的默认方法getFullName,可以在查询结果中添加计算字段。在UserRepository中,调用findByName方法时,返回的是UserProjection类型的List集合,其中包含了name、age和fullName三个属性。
以上就是Projection的几个用法案例。Projection可以灵活地选择实体类的部分属性或者聚合函数的返回结果,以满足不同的业务需求。
阅读全文