我正在尝试实现一种控制器方法,类似于支持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) 我希望通过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) 我正在使用Spring Data JPA和Hibernate处理应用程序,我正在尝试使用ehcache启用二级缓存.我将我的应用程序分解为两个项目:
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) 我是querydsl的新手.我看到了两种类型的querydsl实现.
有什么不同吗?我已经开发了com.mysema.query实现.但我认为我走错了路.请解释一下.
我正在使用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
我正在尝试将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) 我试图通过加入子查询来获得对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) 我正在尝试使用注释和spring-security为我的开源项目添加方法级安全性.我现在面临的问题是找到所有方法,特别是用于分页的方法(例如,返回页面).
使用@PostFilter可以在列表中使用(但我个人认为在应用程序而不是数据库中进行过滤不是一个好主意)但是在分页查询中完全失败.
这是有问题的,因为我有一个Entity包含List<Compound>
.复合有不同的实现,用户可能只有权读取其中一个化合物.Compound使用TABLE_PER_CLASS
继承.存储库实现QueryDslPredicateExecutor
.
我的想法是为每个查询添加一个谓词,根据当前用户限制返回结果.然而,我有点迷失在a)用户和角色的数据模型应该如何看,以及b)如何创建谓词(一旦定义了模型,这可能很容易).或者querydsl是否已经提供基于类型的过滤(在查询类中包含的元素)?
假设我有一个像这样的数据模型(伪代码):
@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"属性的东西,无论颜色如何. 如何使这些条件适用于集合中的相同属性?