标签: querydsl

通过REST控制器使用Spring Data JPA和QueryDsl的异常

我正在尝试实现一种控制器方法,类似于支持QueryDsl的最新Gosling发布的Spring Data发布系列中记录的方法.我已经实现了控制器,如http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-文档中的示例所示.安全.一切都在编译,当我启动应用程序时(使用Spring Boot 1.2.5.RELEASE),一切都很顺利.

但是,当我尝试调用我的rest端点时,我总是得到以下异常:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mysema.query.types.Predicate]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:80)
Run Code Online (Sandbox Code Playgroud)

我的猜测是,QuerydslPredicateArgumentResolver没有应用于请求,因此异常.但是QuerydslPredicateArgumentResolver当我查询Spring Boot管理端点时,我看到它被注册为bean /manage/beans.我也确保@EnableSpringDataWebSupport我的@Configuration班级没有效果.

我对控制器进行了注释@BasePathAwareController,因为我在Spring Data REST中使用它,我希望这些方法与Spring Data REST公开的方法类似.我也尝试过使用@RepositoryRestController,但这似乎并不重要.但是,当使用@RestController并将其放在与Spring Data REST正在使用的基本路径不同的路径下时,一切正常.所以问题是,它应该有效吗?

现在整个控制器是:

@RestController
@RequestMapping(value = "/query")
public class AvailController
{
    private final AvailRepository repo;

    @Autowired
    public AvailController(AvailRepository repository)
    {
        this.repo = repository;
    }

    @RequestMapping(value = "/avails", method = GET)
    public @ResponseBody …
Run Code Online (Sandbox Code Playgroud)

java querydsl spring-data spring-data-jpa spring-data-rest

13
推荐指数
1
解决办法
2002
查看次数

如何将弹簧数据Sort转换为querydsl OrderSpecifier?

这基本上与此相反: 如何使用Spring JPA进行分页QueryDSL查询?

这是一个自定义查询,我不能使用任何findAll()方法.

编辑:

发布了错误的链接.现在纠正了.

querydsl spring-data

12
推荐指数
3
解决办法
2万
查看次数

QueryDSL,spring-boot和Gradle

我希望通过gradle将querydsl带入我的spring-boot项目.尽管在网上找到了几个例子,但由于依赖性问题(我认为),它们实际上都不适合我.根据QueryDSL支持论坛,尚不支持gradle.但是我想知道如果有人设法让它工作了所有的gradle和spring-boot?

这是我的build.gradle:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'war'

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
    }
}

repositories {
    mavenCentral()
    maven { url: "http://repo.spring.io/libs-snapshot" }
//    maven { url: "http://repo.spring.io/milestone" }

}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.0.0.RC5")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.0.RC5")
    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final")
    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile('org.codehaus.groovy:groovy-all:2.2.1')
    compile('org.jadira.usertype:usertype.jodatime:2.0.1')

    // this line fails
    querydslapt "com.mysema.querydsl:querydsl-apt:3.3.2"

    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') {
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+')
    testCompile("junit:junit")
} …
Run Code Online (Sandbox Code Playgroud)

gradle querydsl spring-boot

12
推荐指数
2
解决办法
8442
查看次数

Spring数据JPA与Hibernate和Ehcache无法正常工作

我正在使用Spring Data JPA和Hibernate处理应用程序,我正在尝试使用ehcache启用二级缓存.我将我的应用程序分解为两个项目:

  • CoreDataFacade:我使用QueryDSL定义数据访问操作,Spring Data JPA使用Hibernate和ehcache.
  • QueryComponent:是一个Spring引导项目,它使用CoreDataFacade项目来访问数据.

CoreDataFacade的配置如下:

的pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.7.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.6.Final</version>
    </dependency>

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.4.7</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.3.6.Final</version>  
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.6.Final</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.33</version>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>3.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>3.6.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

应用程序的context.xml

<jpa:repositories
    base-package="com.coredata.services.impl.sql.mysql.repositories" />

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost/FOO" p:user="****" p:password="****"
    p:acquireIncrement="5" p:minPoolSize="10" p:maxPoolSize="100"
    p:maxIdleTime="1200" p:unreturnedConnectionTimeout="120" />

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="MYSQL" p:showSql="true" p:generateDdl="true" /> …
Run Code Online (Sandbox Code Playgroud)

spring hibernate jpa ehcache querydsl

12
推荐指数
2
解决办法
7350
查看次数

com.mysema.query和com.querydsl之间的区别?

我是querydsl的新手.我看到了两种类型的querydsl实现.

有什么不同吗?我已经开发了com.mysema.query实现.但我认为我走错了路.请解释一下.

querydsl

12
推荐指数
1
解决办法
3892
查看次数

Spring Data Mongodb:如何转储通过QueryDsl生成的原始查询/命令?

我正在使用Spring Data的Querydsl集成来使用谓词执行我的查询.

findAll(predicate, pageable)
Run Code Online (Sandbox Code Playgroud)

有没有办法转储执行的实际原始查询/命令?

我也查看了这个问题的答案,它对我不起作用. 配置MongoDB Java驱动程序的日志记录

- 更新 - 我设法通过在application.properties(而不是log4j.properties)中添加logging.level.org.mongodb.driver = DEBUG来使日志工作正常工作

但是,我仍然无法看到正在执行的原始查询:

2016-03-23 21:50:56 DEBUG查询:56 - 查询完成2016-03-23 21:50:56 DEBUG查询:56 - 在连接上发送命名空间testdb.reservation的查询[connectionId {localValue:4,serverValue: 42631}]到服务器ds046785.mongolab.com:39186

java mongodb querydsl spring-data spring-data-mongodb

12
推荐指数
1
解决办法
1969
查看次数

Java 11 + QueryDSL 4 + Gradle 5 + SpringBoot 2.1- 不生成 QClasses

我正在尝试将QueryDSL、Gradle 和 Springboot集成到标题版本中。我向 gradle 添加了 annotationProcessors,但 Intellij 仍然没有生成 QClasses。我尝试了来自社区的建议以使用插件 'gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin' 但这没有帮助。

dependencies{
   annotationProcessor("org.projectlombok:lombok:1.18.4")
   annotationProcessor("com.querydsl:querydsl-apt:4.2.1")
   annotationProcessor("org.springframework.boot:spring-boot-starter-data-jpa:2.1.1.RELEASE")

   compileOnly("org.projectlombok:lombok:1.18.4")
   implementation("com.querydsl:querydsl-jpa:4.2.1")
   implementation("com.querydsl:querydsl-apt:4.2.1:jpa")
   implementation("org.springframework.boot:spring-boot-starter-data-jpa:2.1.1.RELEASE")
   implementation("org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE")
}
Run Code Online (Sandbox Code Playgroud)

gradle lombok querydsl spring-boot

12
推荐指数
2
解决办法
8470
查看次数

JPQL/QueryDSL:加入子查询并获取别名列

我试图通过加入子查询来获得对groupBy的计数的平均值.不知道这是否是正确的方法,但除了mysema doc之外我无法解决任何关于子查询的问题.

场景:客户平均每件产品订单数量是多少?含义:客户订购产品.因此,客户多次(计数)订购了特定产品.客户为任何产品订购的平均订单数量是多少?

可能听起来有点假设,事实上它只是原型的一部分,但它让我想知道如何使用来自Mysema的花哨的QueryDSL来获取在子查询中创建的自定义列的引用.

在SQL中,您只需为count列指定一个别名,并使用第二个ID列进行连接.QueryDSL也有"as()"方法,但我不知道,如何检索该列加上我看不出它如何与其他人加入一个查询,因为query.list()只是获取一个列表但是对于某些加入接受它的原因.感觉不对...

这是我的代码:

    JPQLQuery query = createJPQLQuery();

    QOrdering qOrdering = QOrdering.ordering;
    QProduct qProduct = QProduct.product;
    QCustomer qCustomer = QCustomer.customer;           

    // how many of each product did a customer order?
    HibernateSubQuery subQuery = new HibernateSubQuery();
    subQuery.from(qOrdering).innerJoin(qOrdering.product,qProduct).innerJoin(qOrdering.customer, qCustomer);
    subQuery.groupBy(qCustomer,qProduct).list(qCustomer.id,qProduct.id,qProduct.count());

    // get the average number of orders per product for each customer
    query.from(qCustomer);      
    query.innerJoin(subQuery.list(qCustomer.id,qOrdering.count().as("count_orders")));      
    query.groupBy(qCustomer.id);
    return (List<Object[]>) query.list(qCustomer.firstname,subQuery.count_orders.avg());
Run Code Online (Sandbox Code Playgroud)

再说一次:我如何加入子查询?如何获得别名"count"列以进行更多聚合,例如avg(我的团队是正确的btw?)可能是因为我有其他一些错误,所以任何帮助表示赞赏!

谢谢!

编辑: 这是我希望看到QueryDSL产生的本机SQL:

Select avg(numOrders) as average, cust.lastname from
customer cust
inner join
(select count(o.product_id) as numOrders, c.id as cid, p.name …
Run Code Online (Sandbox Code Playgroud)

subquery jpql querydsl

11
推荐指数
1
解决办法
2万
查看次数

Spring Data JPA和spring-security:在数据库级别上过滤(特别是对于分页)

我正在尝试使用注释和spring-security为我的开源项目添加方法级安全性.我现在面临的问题是找到所有方法,特别是用于分页的方法(例如,返回页面).

使用@PostFilter可以在列表中使用(但我个人认为在应用程序而不是数据库中进行过滤不是一个好主意)但是在分页查询中完全失败.

这是有问题的,因为我有一个Entity包含List<Compound>.复合有不同的实现,用户可能只有权读取其中一个化合物.Compound使用TABLE_PER_CLASS继承.存储库实现QueryDslPredicateExecutor.

我的想法是为每个查询添加一个谓词,根据当前用户限制返回结果.然而,我有点迷失在a)用户和角色的数据模型应该如何看,以及b)如何创建谓词(一旦定义了模型,这可能很容易).或者querydsl是否已经提供基于类型的过滤(在查询类中包含的元素)?

spring-security querydsl spring-data

11
推荐指数
2
解决办法
5459
查看次数

带有QueryDslPredicateExecutor的Spring-Data-JPA并加入到集合中

假设我有一个像这样的数据模型(伪代码):

@Entity
Person {
    @OneToMany
    List<PersonAttribute> attributes;
}

@Entity
PersonAttribute {
    @ManyToOne
    AttributeName attributeName;

    String attributeValue;
}

@Entity
AttributeName {
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我有一个Spring-Data-JPA存储库,例如:

public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person>{}
Run Code Online (Sandbox Code Playgroud)

我在QueryDSL文档中看到有一种从Person加入PersonAttribute的机制,但看起来你需要访问QueryDsl Query对象,而该对象是存储库的客户端所不具备的.

我想用Predicate做的是找到所有具有AttributeValue(有一个连接)的人,其值为"blue",而AttributeName(有另一个连接)的名称为"eyecolor".我不确定如何做到这一点any()并强制执行我只得到那些eye_color =蓝色而不是那些有shoe_color =蓝色的那些.

我希望我能做到这样的事情:

QPerson person = QPerson.person;
QPersonAttribute attribute = person.attributes.any();

Predicate predicate = person.name.toLowerCase().startsWith("jo")
    .and(attribute.attributeName().name.toLowerCase().eq("eye color")
          .and(attribute.attributeValue.toLowerCase().eq("blue")));
Run Code Online (Sandbox Code Playgroud)

但是any()在那里它只匹配任何属性值为"blue"的东西和任何具有"eye color"属性的东西,无论颜色如何. 如何使这些条件适用于集合中的相同属性?

java querydsl spring-data spring-data-jpa

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