我如何在QueryDSL中表达where子句:
WHERE (E1 AND E2) OR (E3 AND E4)
Run Code Online (Sandbox Code Playgroud)
E1..E4是任意布尔表达式.关键是在括号内开始查询,因此(E1和E2).
我正在使用带有QueryDSL 2.9.0的spring-data-mongodb 1.2.0.
为什么不QueryDslPredicateExecutor有delete(Predicate predicate)方法?
有解决方法吗?
首先,我是QueryDSL的新手.
我正在使用Spring + Hibernate环境.
我面临的问题是构建GenericDAO来实现所有基本的CRUD操作,但我不知道如何从QEntity获取静态引用.
我的实体类结构如下所示:
@Entity //jpa
public class Entity extends AbstractEntity{
//fields
...
}
public abstract class AbstractEntity{
//Logger
}
Run Code Online (Sandbox Code Playgroud)
QueryDSL生成的实体的基本结构
public class QEntity extends PEntity<Entity>{
...
public static final QEntity entity = new QEntity("entity");
...
//constructors
}
Run Code Online (Sandbox Code Playgroud)
GenericDao看起来像这样:
public class abstract GenericDao<T extends AbstractEntity, K extends PEntity<? extends AbstractEntity>>{
//some kind of method to get the K.k (QEntity.entity) reference.
//CRUD operations using T and K
}
Run Code Online (Sandbox Code Playgroud)
一种方法是使用Reflection,但我不是使用该方法的倡导者,尤其是在这种情况下.
另一件我不确定的事情是,是否必须使用QEntity中的静态引用来构建查询,或者如果我进行构造函数调用以获取新对象,则可以.另外,构造函数参数中的String表示什么?
public QEntity(String variable) {
this(Entity.class, forVariable(variable), INITS);
}
Run Code Online (Sandbox Code Playgroud) 我们在项目中使用JPA2,Spring Data和QueryDSL.我有以下表格和相关的JPA实体:
table Person (id, ...)
table Activity (id, type, ...)
@Entity
@Configurable
public class Activity {
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "ACTIVITY_ID"))
@NotEmpty
@Valid
private Set<ActivityName> names = new HashSet<>();
table ActivityName(activity_id, name, ...)
@Embeddable
@Immutable
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "NAME"))
public static class ActivityName { ... }
table ActivityLevel(person_id, activity_id, level)
@Entity
@Immutable
@Validated
public final class ActivityLevel{...}
Run Code Online (Sandbox Code Playgroud)
1..n for Actitivy to ActivityName - 活动可能有不同的名称(例如跑步,慢跑)
一个人可能对某个特定活动具有一定的水平,并且可以执行多个活动(每个活动都有一个定义的级别).
示例以下数据:
我有这个pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
而这个实体:
@Entity
@Data
@Builder
public class DataDto {
@Id
private String id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
这个回购:
public interface DataRepo …Run Code Online (Sandbox Code Playgroud) 我在Eclipse中有一个Maven Spring-Hibernate-JPA-QueryDsl Web应用程序,它The type com.querydsl.core.types.Predicate cannot be resolved在CommonRepositoryImpl.java类中提供错误.错误标记出现在类的包声明中.这是有问题的java类:
package com.kletus.silentHomeCemetery.frameworkextension;
import com.kletus.silentHomeCemetery.frameworkextension.InjectLogger;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import com.mysema.query.jpa.JPQLQuery;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Filter;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.QueryDslJpaRepository;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.transaction.annotation.Transactional;
@SuppressWarnings("unchecked")
@NoRepositoryBean
@Transactional
public class CommonRepositoryImpl<T, ID extends Serializable> extends
QueryDslJpaRepository<T, ID> implements CommonRepository<T, ID>,
Serializable
{
private static final long serialVersionUID = 1L;
@InjectLogger
private …Run Code Online (Sandbox Code Playgroud) 我试图说服"更高层次"使用querydsl sql来保持持久性.但是他们更喜欢spring jdbctemplate,原因是它提供了最好的原始性能.
表现是我们对课程的首要要求.这就是为什么JPA根本不是一个选择.QueryDSL SQL开销是否过多,无法从我们的选项中解脱出来?
我想知道是否有任何"最近的"性能测试来显示querydsl sql如何使用jdbctemplate和jpa.
我遇到过这个.我想知道querydsl sql与jdbctemplate和jpa实现进行比较时的相对性能.
我需要一些启用了QueryDSL的自定义查询方法,并遵循此SO答案。
效果很好,但是在升级到Spring Boot 2.1(升级了Spring Data)之后,我发现它QuerydslJpaRepository已被弃用。简单地将其替换为QuerydslJpaPredicateExecutor- 文档会告诉我使用-会导致错误:
引起原因:java.lang.IllegalArgumentException:类[... ProjectingQueryDslJpaRepositoryImpl]的对象必须是接口org.springframework.data.jpa.repository.support.JpaRepositoryImplementation的实例。
...但是实施JpaRepositoryImplementation将意味着我必须实施所有标准的CRUD方法,这显然是我所不希望的。因此,如果我repositoryBaseClass从中删除config @EnableJpaRepositories,以将其视为带有实现的存储库片段,则它将尝试实例化该片段,即使已将其标记为,也会@NoRepositoryBean出现错误:
原因:java.lang.IllegalArgumentException:无法创建方法公共抽象java.util.Optional ProjectingQueryDslJpaRepository.findOneProjectedBy(com.querydsl.core.types.Expression,com.querydsl.core.types.Predicate)的查询!提供至少1个参数,但查询中仅提供0个参数。
...
原因:java.lang.IllegalArgumentException:提供了至少1个参数,但查询中仅存在0个参数。
原始版本:
@Configuration
@EnableJpaRepositories(basePackageClasses = Application.class, repositoryBaseClass = ProjectingQueryDslJpaRepositoryImpl.class)
@EnableTransactionManagement
@EnableJpaAuditing
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class DatabaseConfig {}
Run Code Online (Sandbox Code Playgroud)
_
@NoRepositoryBean
public interface ProjectingQueryDslJpaRepository<T> extends QuerydslBinderCustomizer<EntityPath<T>>, QuerydslPredicateExecutor<T> {
@NonNull
<P> Page<P> findPageProjectedBy(@NonNull Expression<P> factoryExpression, Predicate predicate,
@NonNull Pageable pageable);
@NonNull
<P> Optional<P> findOneProjectedBy(@NonNull Expression<P> factoryExpression, @NonNull Predicate predicate);
@Override
default void customize(@NonNull QuerydslBindings bindings, …Run Code Online (Sandbox Code Playgroud) 假设我有CustomerQueryInfo以下属性的bean:
我想使用此类型的对象执行" QueryDSL "搜索,该对象将返回客户列表List<Customer>.
如果其中一个字段CustomerQueryInfo是null,我不想在搜索中使用它.因此CustomerQueryInfo,设置null了所有三个字段的对象将返回所有客户.
我正在寻找使用QueryDSL执行此类搜索的最佳实践.
这样的事情好吗:
private BooleanExpression isFirstNameLike(String firstName){
if(firstName==null)
return true BooleanExpression somehow;
return QCustomer.customer.firstName.like(firstName);
}
private BooleanExpression isStatutEq(StatusEnum status){
if(status==null)
return true BooleanExpression somehow;
return QCustomer.customer.status.eq(status);
}
Run Code Online (Sandbox Code Playgroud)
然后:
return query.from(customer).where(isFirstNameLike(customerQueryInfo.getFirstName).and(isLastNameLike(customerQueryInfo.getLastName).and(isStatusEq(customerQueryInfo.getStatus))).list;
Run Code Online (Sandbox Code Playgroud)
BooleanExpression将评估结果返回true?在官方文档之后,@EnableSpringDataWebSupport在我的Spring配置中添加注释允许Predicate在查询中自动注入一个类:
@RequestMapping(method = RequestMethod.GET, path="/find")
public ResponseEntity<PagedResources<FooResource>> find(Pageable pageable, PagedResourcesAssembler<Foo> assembler, @QuerydslPredicate(root = Foo.class) Predicate predicate) {
Page<Foo> foos = fooRepository.findAll(predicate, pageable)
final ResourceAssemblerSupport<Foo, FooResource> fooResourceAssembler = new ....;
final PagedResources<FooResource> pagedResources = assembler.toResource(foos, fooResourceAssembler);
return new ResponseEntity<>(pagedResources, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在执行GET请求时轻松搜索:
GET /foo/name?=bob&name=alice&age=20
Run Code Online (Sandbox Code Playgroud)
这很好用.但是我想知道如何实现更高级的搜索条件:
><>=<=通常,我想将这些运算符应用于数据模型中的数字和日期字段.Querydsl支持这些标准.
我尝试添加> (%3E)我的查询参数,但它无法解析(例如,对于数字字段,如年龄,它抱怨它不能解析>10为数字.
是否可以在查询中直接使用此运算符?
(如果重要的话我正在使用Spring Data Mongodb)