我想让SQL看起来像:
select b from Book b order by rand()
如何将该查询转换为Querydsl查询?
Querydsl不支持吗?如果您知道支持此查询的方式,请回答它.
谢谢.
我正在尝试学习如何在QueryDSL中使用Neo4j cypher.所以我从neo4j/cypher-dsl GitHub存储库下载了源代码,并将项目作为Maven项目导入eclipse .但是,当我尝试编译并运行测试时,我得到一堆Q {Something}类无法解析的错误,例如:
QPerson cannot be resolved to a type
Run Code Online (Sandbox Code Playgroud)
这是一个截图:

我忘了配置一些东西吗?我找不到任何关于它的教程或任何声明我需要做任何特别的事情......
怎么了?
谢谢!
我在pom.xml中添加了以下代码段,但是在eclipse中,执行部分错误提示:
Plugin execution not covered by lifecycle configuration: com.mysema.maven:maven-apt-plugin:1.0.3:process (execution: default, phase: generate-sources)
Run Code Online (Sandbox Code Playgroud)
虽然当我从命令行运行mvn clean install时,它仍然可以正常工作。
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>maven-apt-plugin</artifactId>
<version>1.0.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<outputDirectory>${project.basedir}/target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
<processors>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</processors>
<showWarnings>true</showWarnings>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
从命令行运行后,它会生成查询dsl类(QClasses),但是从eclipse中不会生成它们。
另外,当我从eclipse运行我的应用程序时,它给出以下错误:
Caused by: java.lang.ClassNotFoundException: xxx.QClass
Run Code Online (Sandbox Code Playgroud)
Eclipse Maven插件有问题吗?我该如何解决?
我必须使用QueryDSL编写此查询:
select *
from table
where(field1, field2) in (
select inner_field_1, inner_field2
from ...
);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何在QueryDSL中使用带有"in"运算符的两个字段(field1和field2).我一直在文档中寻找它,但我还没有看到任何两个字段的例子.
这是我到目前为止:
Expression<?>[] projection = {
table.field1,
table.field2
};
SQLSubQuery outterQuery= new SQLSubQuery()
.from(table)
.where([some expression].in(inneryQuery.list(projection))) // ???
.groupBy(contentcache1.programId, contentcache1.id);
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激
非常感谢你提前
最初的功能MySQL查询,列出所有列出标签的所有提供商:
SELECT * FROM provider
INNER JOIN provider_tag
ON provider_tag.provider_id = provider.id AND provider_tag.tag_id in (1, 2)
GROUP BY (provider.id)
HAVING COUNT(*) = 2
Run Code Online (Sandbox Code Playgroud)
在Querydsl中转换为MySQLQuery非常简单......
MySQLQuery query = new MySQLQuery(conn, dialect);
List<Integer> tagIds = ...;
query.from(provider)
.innerJoin(provider_tag)
.on(providerTag.providerId.eq(provider.id), providerTag.tagId.in(tagIds))
.groupBy(provider.id)
.having(???);
Run Code Online (Sandbox Code Playgroud)
......除了条件having.
如何添加COUNT(*)到查询?
在蒂莫的第一次修正提案后编辑:
所以,查询看起来像这样:
SearchResults<Tuple> result = query.from(provider)
.innerJoin(providerTag)
.on(providerTag.providerId.eq(provider.id), providerTag.tagId.in(tagIds))
.groupBy(provider.id)
.having(Wildcard.count.eq((long) tagIds.size()))
.listResults(
provider.id,
provider.name);
Run Code Online (Sandbox Code Playgroud)
但是,Illegal operation on empty result set如果结果集为空,则会导致SQLException .
我的其他返回空结果集的查询不会导致异常,所以我想我不应该捕获异常,但是有一个问题需要修复?
生成的MySQL工作正常(返回0行),所以问题不存在.
编辑2:
问题在于groupBy().如果应用问题中 …
我正在尝试将这些SQL语句用于QueryDSL调用.
select t.asd_id, count(*) as count from asset_object t
left join asset_data ad on (t.asd_id = ad.asd_id)
where
exists (select * from assetobject_parents p
where t.aso_id = p.aso_id and p.ctd_id = 1)
group by t.asd_id
order by count(*) desc, t.asd_id asc
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个提示或解决方案吗?
这是我的域名(摘录):
@Entity
public class AssetObject {
@Id
@Column(name = "ASO_ID")
private Long asoId;
@ManyToMany
@OrderColumn(name = "ASP_ORDER")
@JoinTable(name = "ASSETOBJECT_PARENTS", joinColumns = { @JoinColumn(name = "ASO_ID", referencedColumnName="ASO_ID") }, inverseJoinColumns = { @JoinColumn(name = "CTD_ID", referencedColumnName="CTD_ID") })
private List<CategoryData> …Run Code Online (Sandbox Code Playgroud) 我对Criteria API有一些经验,但我之前从未使用过QueryDsl.我想问的是使用QueryDsl而不是Criteria API有什么优点/缺点?特别是我想知道哪一个更适合大型数据库(我的意思是复杂的查询).
我有这个Bean对象:
@Entity
@Table(name="a_table")
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="amount")
private int amount;
@ManyToOne
private B b;
@ManyToOne
private C c;
public MunicipalityInventory(int amount, B b, C c) {
this.amount = amount;
this.b = b;
this.c = c;
}
Run Code Online (Sandbox Code Playgroud)
我尝试将查询结果绑定到上面的对象。我第一次尝试使用QueryDSL是这样的(它在某种意义上说是正确的数据表示,但是它没有将查询的属性绑定到对象,因为它返回Tuple了包含StringPath,NumberExpression以及其他怪异的数据类型)
public List<Tuple> findAll(){
QA a = QA.A;
QB b = QB.b;
QC c = QC.c;
JPAQuery query = new JPAQuery(entityManager);
return query.from(a)
.innerJoin(a.b, b)
.innerJoin(a.c, c)
.orderBy(c.name.asc())
.groupBy(c.name, a.c, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在QueryDsl中翻译此查询:
update myThings set firstColumn = 'newValue' where secondColumn in ('interesting', 'stuff')
Run Code Online (Sandbox Code Playgroud)
我花了数小时寻找文档,但是Java fu在这个文档中不够强大... :(我可以找到各种各样的QueryDsl示例,但是我找不到任何示例。我可能需要SimpleExpression.eqAny(CollectionExpression) ,但我不知道如何在简单的字符串列表中构建这样的CollectionExpression。
List<String> interestingValues = Arrays.asList("interesting", "stuff");
queryFactory.update(myThings)
.set(myThings.firstColumn, "newValue")
// .where(myThings.secondColumn.in(interestingValues)
// 'in' will probably try to look in table "interestingValues"?
// .where(myThings.secondColumn.eqAny(interestingValues)
// 'eqAny' seems interesting, but doesn't accept a list
.execute();
Run Code Online (Sandbox Code Playgroud)
我所能找到的只是API定义,但后来我迷上了泛型的任何其他“新” java概念,但我仍然很难理解。一个例子将不胜感激。
如何编写WHERE类似于WHERE ? BETWEEN col1 AND col2QueryDSL的子句?我知道我可以这样写,
...
.where(mytable.col1.loe(constant), mytable.col2.goe(constant))
...
Run Code Online (Sandbox Code Playgroud)
但是,使用BETWEEN会使查询更具可读性。
我使用QueryDSL 3.2.3。
更新:
我最终得到了这样的东西(一个可通过运行的测试用例mvn test):
final int constant = 10;
final QMyTable m = QMyTable.myTable;
final SimpleExpression<Boolean> operation = Expressions.operation(Boolean.class, Ops.BETWEEN,
Expressions.constant(constant), m.col1, m.col2);
// This yields:
// SELECT ID, COL1, COL2 FROM MYTABLE WHERE ((? BETWEEN COL1 AND COL2) = ?)
// bind => [10, true]
final MyTable actual = new JPAQuery(em).from(m).where(operation.eq(true)).uniqueResult(m);
Run Code Online (Sandbox Code Playgroud)
无论如何它都能工作,但是该部分= ?是多余的。我想要一个更简单的东西,例如:
SELECT ID, COL1, …Run Code Online (Sandbox Code Playgroud)