标签: querydsl

QueryDSL中的简单(E1和E2)OR(E3和E4)表达式

我如何在QueryDSL中表达where子句:

 WHERE (E1 AND E2) OR (E3 AND E4) 
Run Code Online (Sandbox Code Playgroud)

E1..E4是任意布尔表达式.关键是在括号内开始查询,因此(E1和E2).

querydsl

8
推荐指数
1
解决办法
5989
查看次数

QueryDSL删除方法

我正在使用带有QueryDSL 2.9.0的spring-data-mongodb 1.2.0.

为什么不QueryDslPredicateExecutordelete(Predicate predicate)方法?

有解决方法吗?

querydsl spring-data spring-data-mongodb

8
推荐指数
1
解决办法
2983
查看次数

如何使用QueryDSL构建GenericDao?

首先,我是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)

java generics dao jpa querydsl

8
推荐指数
1
解决办法
2907
查看次数

使用JPA/QueryDSL的类似Pivot的结果

我们在项目中使用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 - 活动可能有不同的名称(例如跑步,慢跑)

一个人可能对某个特定活动具有一定的水平,并且可以执行多个活动(每个活动都有一个定义的级别).

  • 应该搜索活动名称(例如跑步等)作为参数(活动名称列表)
  • 因此,应该找到执行相关活动的所有人员.
  • 结果应包含搜索所有活动的相应级别,人员姓名和人员活动的总和

示例以下数据:

  • Person =(id = 1,name = Bob)
  • Person =(id …

java sql pivot jpa querydsl

8
推荐指数
1
解决办法
1087
查看次数

Spring Boot + JPA + QueryDSL =未找到OrderSpecifier

我有这个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)

java maven querydsl spring-data-jpa spring-boot

8
推荐指数
1
解决办法
7730
查看次数

无法解析com.querydsl.core.types.Predicate类型.它是从所需的.class文件间接引用的

我在Eclipse中有一个Maven Spring-Hibernate-JPA-QueryDsl Web应用程序,它The type com.querydsl.core.types.Predicate cannot be resolvedCommonRepositoryImpl.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)

hibernate querydsl spring-data spring-data-jpa

8
推荐指数
1
解决办法
8359
查看次数

QueryDSL SQL与JDBCTemplate之间的性能测试

我试图说服"更高层次"使用querydsl sql来保持持久性.但是他们更喜欢spring jdbctemplate,原因是它提供了最好的原始性能.

表现是我​​们对课程的首要要求.这就是为什么JPA根本不是一个选择.QueryDSL SQL开销是否过多,无法从我们的选项中解脱出来?

我想知道是否有任何"最近的"性能测试来显示querydsl sql如何使用jdbctemplate和jpa.

我遇到过这个.我想知道querydsl sql与jdbctemplate和jpa实现进行比较时的相对性能.

java spring jdbc querydsl

8
推荐指数
1
解决办法
2988
查看次数

用QuerydslJpaPredicateExecutor替换不推荐使用的QuerydslJpaRepository失败

我需要一些启用了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)

querydsl spring-data spring-data-jpa spring-boot

8
推荐指数
1
解决办法
2683
查看次数

返回一个计算结果为true的QueryDSL BooleanExpression

假设我有CustomerQueryInfo以下属性的bean:

  • String firstName
  • 字符串lastName
  • StatusEnum状态

我想使用此类型的对象执行" QueryDSL "搜索,该对象将返回客户列表List<Customer>.

如果其中一个字段CustomerQueryInfonull,我不想在搜索中使用它.因此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)
  1. 如何BooleanExpression将评估结果返回true?
  2. 如果不建议采用上述方法,那么建议的最佳做法是什么?

null querydsl

7
推荐指数
4
解决办法
2万
查看次数

Spring - 支持QueryDsl的高级比较器

官方文档之后,@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)

java spring querydsl spring-data spring-boot

7
推荐指数
1
解决办法
1621
查看次数