springboot+jpa2.2.10 QueryDSL写个详细案例,从配置到查询
时间: 2024-01-13 18:02:52 浏览: 98
好的,我会为你提供一个详细的案例来展示如何使用springboot jpa2.2.10和QueryDSL进行查询。
首先,我们需要在pom.xml文件中添加相关的依赖:
```xml
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>4.2.2</version>
</dependency>
```
接下来,我们需要创建一个实体类,假设我们的实体类是`User`,在这个实体类中,我们需要添加一些jpa注解,例如:`@Entity`、`@Table`、`@Id`和`@GeneratedValue`等。
User.java
```java
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// Getter and Setter methods
}
```
接下来,我们需要创建一个查询接口,用于定义查询方法。在这个接口中,我们需要继承`JpaRepository`接口,并且添加QueryDSL的相关注解。
UserQueryRepository.java
```java
@Repository
public interface UserQueryRepository extends JpaRepository<User,Long>,QuerydslPredicateExecutor<User>,QuerydslBinderCustomizer<QUser> {
@Override
default void customize(QuerydslBindings bindings, QUser root) {
bindings.bind(String.class).first((StringPath path, String value) -> path.containsIgnoreCase(value));
}
List<User> findAll(Predicate predicate);
}
```
在这个接口中,我们使用`QuerydslPredicateExecutor`接口来执行对实体类的谓语查询。同时,我们还需要实现`QuerydslBinderCustomizer<QUser>`接口来添加一些自定义的查询条件。
我们在这里添加了一个字符串类型的自定义查询条件,用于模糊查询。可以根据需要添加其他自定义查询条件。
接下来,我们需要创建一个Service类,用于调用查询接口进行数据库操作。在这个Service类中,我们需要注入这个查询接口,并且实现具体的查询方法。
UserService.java
```java
@Service
public class UserService {
@Autowired
UserQueryRepository userQueryRepository;
public List<User> findAll(User user){
QUser qUser = QUser.user;
BooleanBuilder builder = new BooleanBuilder();
if(user.getId()!=null){
builder.and(qUser.id.eq(user.getId()));
}
if(StringUtils.isNotEmpty(user.getName())){
builder.and(qUser.name.contains(user.getName()));
}
if(user.getAge()!=null){
builder.and(qUser.age.eq(user.getAge()));
}
List<User> list = userQueryRepository.findAll(builder.getValue());
return list;
}
}
```
在这个Service类中,我们使用了`BooleanBuilder`来拼接查询条件。同时,我们也使用了`QUser`来代表我们的实体类。
最后,我们需要在SpringBoot的配置文件中配置JPA和QueryDSL。具体的配置内容如下:
application.yaml
```yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
username: root
password: root
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
querydsl:
default-use-collection: true
```
在这个配置文件中,我们添加了一些JPA和QueryDSL的相关配置。其中,`default-use-collection`用于将多个结果集合并成一个结果集。
到此,我们整个案例就完成了。我们可以使用类似下面的代码来测试我们的查询方法:
TestUser.java
```java
@SpringBootTest
class TestUser {
@Autowired
private UserService userService;
@Test
void contextLoads() {
User user = new User();
user.setAge(18);
List<User> list = userService.findAll(user);
System.out.println(list);
}
}
```
通过这个案例,我相信您已经掌握了使用springboot jpa2.2.10和QueryDSL进行查询的方法。如果您还有任何疑问,可以随时向我提问。
阅读全文