我使用 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 按此方式发送字符串吗?
我有一个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 管理)
我发现有很多像我这样的问题,但从来没有在我的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) 我有以下查询,该查询查询(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)
先感谢您。
我在 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) 我在我的 Spring Boot 项目中使用QueryDSL并计划使用 Spring 的网络支持(当前查询 dsl web docs)。问题是,我找不到有关使用不同运算符的任何信息。如何定义not equals或matches 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 中,您如何将过滤器应用于搜索查询?
我是 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) 我想知道是否有一个 DSL 查询可以运行来获取超过一定大小的分片的列表?
_cat/shards 列出了所有这些,但我们有数千个分片,甚至将它们全部导出到 Excel 并尝试按值过滤也很困难。
我们可以指定一个查询来提取那些大于 30Gb 的分片吗?
我正在使用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因为这只是整个复杂查询的一个片段。
我该如何处理该LEFT JOIN x ON部分
如何处理部分中的子查询SELECT payoutBbf.totalPyts别名
考虑以下 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)