有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试使用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();

我猜它可以简化,但另一方面,我不太清楚它是否经过良好的querydsl编码

有什么想法吗


共 (2) 个答案

  1. # 1 楼答案

    除了@natros answer之外,布尔运算符还可用于“和”逻辑

    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();
    
  2. # 2 楼答案

    更简化的版本是:

    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();