我正在努力为Scala创建一个SQL DSL.DSL是Querydsl的扩展,Querydsl是一种流行的Java查询抽象层.
我现在正在努力解决以下非常简单的表达方式
user.firstName == "Bob" || user.firstName == "Ann"
Run Code Online (Sandbox Code Playgroud)
由于Querydsl已经支持可以在这里使用的表达式模型,因此我决定提供从Proxy对象到Querydsl表达式的转换.为了使用代理,我创建了一个这样的实例
import com.mysema.query.alias.Alias._
var user = alias(classOf[User])
Run Code Online (Sandbox Code Playgroud)
通过以下隐式转换,我可以将代理实例和代理属性调用链转换为Querydsl表达式
import com.mysema.query.alias.Alias._
import com.mysema.query.types.expr._
import com.mysema.query.types.path._
object Conversions {
def not(b: EBoolean): EBoolean = b.not()
implicit def booleanPath(b: Boolean): PBoolean = $(b);
implicit def stringPath(s: String): PString = $(s);
implicit def datePath(d: java.sql.Date): PDate[java.sql.Date] = $(d);
implicit def dateTimePath(d: java.util.Date): PDateTime[java.util.Date] = $(d);
implicit def timePath(t: java.sql.Time): PTime[java.sql.Time] = $(t);
implicit def comparablePath(c: Comparable[_]): PComparable[_] = $(c);
implicit …Run Code Online (Sandbox Code Playgroud) 我正在使用spring数据jpa和querydsl并且被困在如何编写简单的好查询到左连接两个表.假设我有一个Project实体和一个在Project中定义了OneToMany关系的Task实体,我想做的事情如下:
select * from project p left join task t on p.id = t.project_id where p.id = searchTerm
select * from project p left join task t on p.id = t.project_id where t.taskname = searchTerm
Run Code Online (Sandbox Code Playgroud)
在JPQL,它应该是:
select distinct p from Project p left join p.tasks t where t.projectID = searthTerm
select distinct p from Project p left join p.tasks t where t.taskName = searthTerm
Run Code Online (Sandbox Code Playgroud)
我有一个ProjectRepository接口,它扩展了JpaRepository和QueryDslPredicateExecutor.这让我可以访问方法:
Page<T> findAll(com.mysema.query.types.Predicate predicate, Pageable pageable)
Run Code Online (Sandbox Code Playgroud)
我知道,左连接可以通过创建一个新的JPAQuery(EntityManager的)可以轻松实现.但我没有实体管理器与弹簧数据的JPA明确注入.有没有建立一个谓词左加入很好的和简单的方法?希望有人在这里经历了这一点,并能够给我一个例子.谢谢.
弗雷.
比方说,我有两个表Task和Company.Company有列id和name.Task有两列customerId,providerId并链接回id列Company.
使用Querydsl我如何在Company桌面上加入两次,这样我就可以获得name由customerIdand 指定的每个公司providerId?
代码可能更好地解释了我正在尝试的内容:
Configuration configuration = new Configuration(templates);
JPASQLQuery query = new JPASQLQuery(this.entityManager, configuration);
QTask task = QTask.task;
QCompany customer = QCompany.company;
QCompany provider = QCompany.company;
JPASQLQuery sql = query.from(task).join(customer).on(customer.id.eq(task.customerId))
.join(provider).on(provider.id.eq(task.providerId));
return sql.list(task.id, customer.name.as("customerName"), provider.name.as("providerName"));
Run Code Online (Sandbox Code Playgroud)
哪个生成SQL:
select task.id, company.name as customerName, company.name as providerName from task join company on company.id = …Run Code Online (Sandbox Code Playgroud) 当使用Lombok注释注释方法或变量时,maven插件将通过处理JPA的源代码来进行投诉.
我在控制台日志中遇到这种情况:
symbol: class __
location: class ServiceBaseMessage
C:\workspaces\[...]\service\ServiceBaseMessage.java:44: error: cannot find symbol
@Getter(onMethod = @__({ @JsonProperty("TYPE") }))
Run Code Online (Sandbox Code Playgroud)
如何使用JPA注释的apt-maven-plugin和queryDSL处理器与lombok注释一起工作?
我使用querydsl这就是为什么我不需要方法findByName(),我的所有存储库接口都是空的.
所以我尝试制作genric代码以避免重复的空方法接口,因为我在hibernate映射的实体中有很多类.
public interface GenericResposotory<T>
extends JpaRepository<T, Integer>, QueryDslPredicateExecutor<T> {
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的服务器时,我收到此错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericResposotory':
Invocation of init method failed; nested exception is
java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
Run Code Online (Sandbox Code Playgroud)
还有没有办法像我尝试做一个通用的存储库?
我有这个pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
而这个实体:
@Entity
@Data
@Builder
public class DataDto {
@Id
private String id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
这个回购:
public interface DataRepo …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为Employee70 列的模型。我如何
SELECT id from t_employee在spring + querydsl不修改此代码中的大量代码的情况下实现查询。
BooleanExpression paramEmployee = qEmployee.company.id.eq(new Long(data.get("company").toString()));
Iterable<Employee> employeeReportIterable =employeeRepository.findAll(paramEmployee);
Run Code Online (Sandbox Code Playgroud) 我有以下课程,我想尝试使用 querydsl 并进行一些基本查询。使用intelliJ 2017.3,没有生成类QUser。我试过在谷歌上搜索我的问题,每个 SO 答案似乎都提供了不同的解决方案(有些没有用,有些我不明白,因为我以前从未使用过这些东西),而且大多数教程似乎都在做完全不同的事情。
我曾尝试使用 Spring Boot 似乎内置的任何内容进行查询(不知道,似乎只是可行,但从它的外观来看它太基本了)并且查询工作得很好,所以我猜这是一些配置问题(我是一个行家和春天的菜鸟)。
// User.java
@Entity
@Table(name = "symptoms")
public class Symptom
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String name;
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我已将这些内容添加到 pom.xml 中:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.1.4</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId> …Run Code Online (Sandbox Code Playgroud) 使用时,尝试访问嵌套对象时遇到问题BooleanBuilder。我已经读过默认值是2级,但是对于我的用例,我需要访问3级嵌套对象。因此,我已经添加@QueryInit了许多其他答案中指出的内容。但是我仍然无法访问它。这是我的代码:
@Document
public class Order implements Serializable {
@QueryInit(*.*)
private Item item;
}
public class Item implements Serializable {
private Details details;
}
public class Details implements Serializable {
private String name;
}
public static BooleanExpression name(String name) {
QOrder order = QOrder.order;
return order.item.details.name.eq(name)
}
Run Code Online (Sandbox Code Playgroud)
我有QOrder,QItem生成了类并且可以正常工作。但是details.description给出了错误,因为QDetails未生成类。我如何使其生成QDetails?
我们正在使用 antlr4 构建我们自己的类似于 Mysql 的查询语言。除了我们只使用where clause,换句话说,用户不输入select/from语句。
我能够为它创建语法并在 golang 中生成词法分析器/解析器/侦听器。
在我们的语法文件 EsDslQuery.g4 下面:
grammar EsDslQuery;
options {
language = Go;
}
query
: leftBracket = '(' query rightBracket = ')' #bracketExp
| leftQuery=query op=OR rightQuery=query #orLogicalExp
| leftQuery=query op=AND rightQuery=query #andLogicalExp
| propertyName=attrPath op=COMPARISON_OPERATOR propertyValue=attrValue #compareExp
;
attrPath
: ATTRNAME ('.' attrPath)?
;
fragment ATTR_NAME_CHAR
: '-' | '_' | ':' | DIGIT | ALPHA
;
fragment DIGIT
: ('0'..'9')
;
fragment ALPHA
: ( 'A'..'Z' | …Run Code Online (Sandbox Code Playgroud)