繁体   English   中英

Querydsl:如何编写“复杂”查询

[英]Querydsl: How to write a “complex” query

我正在尝试使用querydsl创建一个SQL语句。 我想要得到的是:

SELECT P.KEY, COUNT(P.VALUE)
 FROM RESOURCES R JOIN PROPERTIES P ON R.ID = P.ID
 WHERE P.KEY = "key" AND p.VALUE = "value"
 GROUP BY P.VALUE;

我尝试编写一些querydsl代码:

String s = queryFactory
    .query()
    .from(QResource.resource)
    .join(QProperty.property)
    .where(QResource.resource.properties.any().key.eq("key").and(QResource.resource.properties.any().value.eq("value")))
    .groupBy(QProperty.property.value)
    .select(QProperty.property.key, QProperty.property.value.count())
    .toString();

我猜测它可以简化,但另一方面我不太清楚它是否被很好地查询。

有任何想法吗?

一个更简化的版本是:

QResource r = QResource.resource;
QProperty p = QProperty.property;
queryFactory
    .select(p.key, p.value.count())
    .from(r)
    .join(p).on(r.id.eq(p.id))
    .where(p.key.eq("key"), p.value.eq("value"))
    .groupBy(p.value)
    .fetchOne();

除了@natros答案外,布尔运算符可用于“和”逻辑

QResource r = QResource.resource;
QProperty p = QProperty.property;
queryFactory
    .select(p.key, p.value.count())
    .from(r)
    .join(p).on(r.id.eq(p.id))
    .where(p.key.eq("key").and(p.value.eq("value")))
    .groupBy(p.value)
    .fetchOne();

布尔生成器也可用于复杂逻辑

BooleanBuilder builder = new BooleanBuilder();
builder.and(p.key.eq("key"));
builder.and(p.value.eq("value"));
queryFactory
        .select(p.key, p.value.count())
        .from(r)
        .join(p).on(r.id.eq(p.id))
        .where(builder)
        .groupBy(p.value)
        .fetchOne();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM