标签: querydsl

让 QueryDSL 的构造函数使用常量而不是参数

我使用 QueryDSL 来构建查询。结果必须注入到对象内。第一列是 groupBy,第二列是值,第三列是常量。

该常量是一个问题,因为 QueryDSL 希望将其作为参数,这会导致 Hibernate 出现此错误:

org.hibernate.QueryException: 
  Parameters are only supported in SELECT clauses when used as part of a INSERT INTO DML statement 
  [select event.datetime, count(event), ?1]
Run Code Online (Sandbox Code Playgroud)

上面的“?1”应该直接是一个常量字符串“TOTAL”。

这是我的代码:

final Expression<String> TOTAL = Expressions.constant("total");
final StringExpression date = Expressions.stringTemplate("DATE_FORMAT({0},'%Y-%m-%d')", event.datetime);

query.select(Projections.constructor(Stat2DGraphDto.class, date, event.count(), TOTAL))
query.from(event).groupBy(date);
query.fetch();
Run Code Online (Sandbox Code Playgroud)

如果我从构造函数中删除 TOTAL,它会按预期工作,但我需要这个常量来稍后准备 UNION。

我可以强制 QueryDSL 按此方式发送字符串吗?

java hibernate querydsl

3
推荐指数
1
解决办法
2580
查看次数

SimplePath 内字段的 Querydsl 4 StringExpression

我有一个Order包含一个OrderCustomer字段的实体,并且OrderCustomer实体有一个Customer字段。

@Document
public class Order {
    private OrderCustomer orderCustomer;
}

public class OrderCustomer {
    private Customer customer;
}

public class Customer {
    private String referenceNumber;
}
Run Code Online (Sandbox Code Playgroud)

生成的查询类org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor如下所示:

public QOrder {
    public final QOrderCustomer orderCustomer;
}

public QOrderCustomer {
    public final SimplePath<Customer> = createSimple("customer", Customer.class);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何创建谓词来检查Customer.referenceNumber是否包含来自客户端的任何字符串输入?

例如: QOrder.order.orderCustomer.customer.referenceNumber.contains("anystring")

或者代码可能没有正确生成?应该生成 QCustomer 吗?

我的依赖版本:querydsl 4.1.4 + spring-data-mongodb 1.9.5(由 spring-data-releasetrain:Hopper-SR5 管理)

java mongodb querydsl spring-data-mongodb

3
推荐指数
1
解决办法
1371
查看次数

JpaRepository Querydsl:Qclass 不生成

我发现有很多像我这样的问题,但从来没有在我的Spring-boot项目中启用Querydsl的答案。这是我的依赖项和插件:pom.xml

    <properties>
        <querydsl.version>3.7.4</querydsl.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-core</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            //added for QueryDsl
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>maven-apt-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution> …
Run Code Online (Sandbox Code Playgroud)

maven querydsl spring-boot

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

带过滤器的 Elasticsearch simple_query_string

我有以下查询,该查询查询(simple_query_string)并且也确实提出建议,但在执行任何操作之前,我想使用术语过滤数据。

{
    "query": {
      "simple_query_string": {
        "fields": ["merchant.basic"],
        "query": "(sterbuck|sterbuck*)",
        "default_operator": "and"
      }
    },
    "suggest": {
      "text": "sterbuck",
      "phraseSuggestion": {
        "phrase": {
          "field": "merchant.basic",
          "direct_generator": [{
            "field": "merchant.basic",
            "suggest_mode": "popular",
            "min_word_length": 3,
            "prefix_length": 2
          }]
        }
      }
    },
    "size": 4,
    "_source": ["merchant"]
  }
Run Code Online (Sandbox Code Playgroud)

先感谢您。

querydsl elasticsearch

3
推荐指数
1
解决办法
3125
查看次数

带 And 和 Or 条件的 Elasticsearch 查询

我在 Elastic 中有如下数据

{
  "_index": "prod",
  "_type": "log",
  "_id": "aa",
  "_source": {
    "input_type": "log",
    "sourcetype": "sourcetypeapp1",
    "message": "APP COMPANY|80d596f6-2082-4a1d-bcfc-740478f626ec|001 ErrorMessage: Some error"
    "type": "log",
    "tags": [
      "beats_input_codec_plain_applied"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我想搜索消息中包含以下数据的所有消息:-

(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" AND Message:"ErrorMessage")
Run Code Online (Sandbox Code Playgroud)

我对elasticsearch查询不太了解,

我尝试过下面的简单查询,它不起作用(只有一个条件):

{
  "query": {
    "bool": {
      "must": {
        "bool": {
          "should": [
            {
              "match": {
                "Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

querydsl elasticsearch kibana

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

如何在 QueryDSL Web 中使用不同的运算符?

我在我的 Spring Boot 项目中使用QueryDSL并计划使用 Spring 的网络支持(当前查询 dsl web docs)。问题是,我找不到有关使用不同运算符的任何信息。如何定义not equalsmatches regex操作?乍一看,它所做的只是将您的?fieldname=value格式GET请求转换为您在存储库中设置的预定义操作。我可以以某种方式扩展它以允许对同一字段进行多次操作吗?

例子。:

目前我可以Predicate通过传递 URL 参数来获取 QueryDsl ,例如?user.company.id=1

@Controller
class UserController {

  @Autowired UserRepository repository;

  @RequestMapping(value = "/", method = RequestMethod.GET)
  Page<User> getUsers(@QuerydslPredicate(root = User.class) Predicate predicate,    
          Pageable pageable) {

    return repository.findAll(predicate, pageable);
  }
}
Run Code Online (Sandbox Code Playgroud)

但正如我链接的文档所述,我只能为某个字段定义一个操作。如果我想要用户,从哪里user.lastName开始并且仍然可以查询完全匹配怎么办?(?lastName=Xyz,contains?lastName=Xyz,equals可能)

QuerydslBinderCustomizer每场的基础上定义了一些操作,但你只能定义如何处理特定领域,有没有可能添加多个操作。

也许我不能用 QueryDSL 做到这一点,但是通常在 Spring Boot 中,您如何将过滤器应用于搜索查询?

spring querydsl spring-data-jpa spring-boot

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

如何在 Querydsl 中创建子查询

我是 Querydsl 的新手。我必须将以下查询转换为 Querydsl。我尝试如下,但没有得到结果。

任何人都可以告诉我我缺少什么或在查询中做错了什么吗?

select * from room  as room 
      where room.nroom_id not in(
                          select rdm.nroom_id from roomdepartmentmapping as rdm)
Run Code Online (Sandbox Code Playgroud)

我试过这样

    JPAQuery<Tuple> query = new JPAQuery<Tuple>(em);  

    query.from(room) 
         .where(room.nRoomId.notIn
                         (query.select(roomDepartmentMapping.nRoomId)
                               .from(roomDepartmentMapping)
                         )
               );
Run Code Online (Sandbox Code Playgroud)

安慰

   at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:31) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.types.OperationImpl.accept(OperationImpl.java:83) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.jpa.JPQLSerializer.serialize(JPQLSerializer.java:220) ~[querydsl-jpa-4.1.4.jar:na]
        at com.querydsl.jpa.JPQLSerializer.visit(JPQLSerializer.java:358) ~[querydsl-jpa-4.1.4.jar:na]
        at com.querydsl.jpa.JPQLSerializer.visit(JPQLSerializer.java:39) ~[querydsl-jpa-4.1.4.jar:na]
        at com.querydsl.core.types.SubQueryExpressionImpl.accept(SubQueryExpressionImpl.java:57) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92) ~[querydsl-core-4.1.4.jar:na]            
        at com.querydsl.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:403) ~[querydsl-jpa-4.1.4.jar:na]
        at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:231) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:31) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.types.OperationImpl.accept(OperationImpl.java:83) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.core.support.SerializerBase.handle(SerializerBase.java:92) ~[querydsl-core-4.1.4.jar:na]
        at com.querydsl.jpa.JPQLSerializer.serialize(JPQLSerializer.java:220) ~[querydsl-jpa-4.1.4.jar:na]
        at com.querydsl.jpa.JPQLSerializer.visit(JPQLSerializer.java:358) ~[querydsl-jpa-4.1.4.jar:na]
        at …
Run Code Online (Sandbox Code Playgroud)

querydsl notin

3
推荐指数
1
解决办法
6727
查看次数

如何在 Elasticsearch 6.3 中找到哪个 Shard 超过 30Gb

我想知道是否有一个 DSL 查询可以运行来获取超过一定大小的分片的列表?

_cat/shards 列出了所有这些,但我们有数千个分片,甚至将它们全部导出到 Excel 并尝试按值过滤也很困难。

我们可以指定一个查询来提取那些大于 30Gb 的分片吗?

querydsl elasticsearch

3
推荐指数
1
解决办法
1587
查看次数

QueryDsl SQL - 左连接子查询

我正在使用QueryDsl SQL并且我想要left join一个子查询。这是简单的查询SQL

SELECT
  usr.memberId,
  payoutsBbf.totalPyts
FROM
  users usr
  LEFT JOIN
    (SELECT
       pyt.member_id   AS mmb_id,
       SUM(pyt.amount) AS totalPyts
  FROM
    payout pyt
  WHERE
    pyt.payoutPeriod < '2018-01-01'
    GROUP BY pyt.member_id) AS payoutsBbf ON usr.id = payoutsBbf.mmb_id
Run Code Online (Sandbox Code Playgroud)

我希望将其写入QueryDsl SQL,并且将子查询保留到主表中几乎很重要,users因为这只是整个复杂查询的一个片段。

  1. 我该如何处理该LEFT JOIN x ON部分

  2. 如何处理部分中的子查询SELECT payoutBbf.totalPyts别名

java mysql querydsl spring-data

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

数组中的 QueryDSL 不区分大小写的过滤器

考虑以下 Java 类:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.List;

@Document(collection = "Doc")
public class Doc {

    @Id
    private String id;

    private List<String> tags;
}
Run Code Online (Sandbox Code Playgroud)

我为其生成了一个查询类型,QDoc因为我想轻松地按不区分大小写的标签名称进行过滤。

/**
 * QDoc is a Querydsl query type for Doc
 */
@Generated("com.querydsl.codegen.EntitySerializer")
public class QDoc extends EntityPathBase<Doc> {

    private static final long serialVersionUID = 602371596L;

    private static final PathInits INITS = PathInits.DIRECT2;

    public static final QDoc doc = new QDoc("doc");

    public final StringPath id = createString("id");

    public final ListPath<String, StringPath> tags …
Run Code Online (Sandbox Code Playgroud)

java spring querydsl

3
推荐指数
1
解决办法
3710
查看次数