QueryDSL是什么?
官方描述我就不复制了。可以简单直观的理解为,不想写sql的人,可以用代码来替代。比如看下面一个栗子:
QCustomer customer = QCustomer.customer;
Customer bob = queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob"))
.fetchOne();
官网的,很直观,不用我解释了吧。
东西是挺好,可官网只有跟maven,ant的集成,没有跟gradle的。所以网上搜了一下,最后在国外的一篇博客中找到了,我把主要内容翻译过来,你们想看英文的,也可以直接看原文:http://bsideup.blogspot.com/2015/04/querydsl-with-gradle-and-idea.html
源码也贴出来:https://github.com/bsideup/querydsl-gradle-idea
QueryDSL+gradle
build.gradle 可以像这样:
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
compile "com.mysema.querydsl:querydsl-jpa:3.6.3"
compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" // Magic happens here
compile "org.hibernate:hibernate-entitymanager:4.3.5.Final"
compile 'com.h2database:h2:1.4.187'
}
然后贴上一个bean,字段跟表对应:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里注意,
@Entity
使我们生成q代码的关键,querydsl的版本号要在
3.6.3
以上,否则不一定有。
然后写上测试代码
import com.mysema.query.jpa.impl.JPAQuery;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static ru.trylogic.querydsl.example.QUser.user;
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit");
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(new User("Smith"));
entityManager.persist(new User("Gates"));
entityManager.persist(new User("Orlov"));
entityManager.persist(new User("Smirnov"));
entityManager.persist(new User("Orlov"));
entityManager.flush();
transaction.commit();
JPAQuery query = new JPAQuery(entityManager);
List<String> uniqueUserNames = query.from(user)
.where(user.name.like("%ov"))
.groupBy(user.name)
.list(user.name);
System.out.println("Unique names:");
for (String uniqueUserName : uniqueUserNames) {
System.out.println(uniqueUserName);
}
entityManager.close();
emf.close();
}
}
你们都懂的,就是放6个人,按照名字分组,搜索名字ov结尾的打印。
然后,你们就会成功。。的发现编译报错啊:
缺少Q文件。。。
然而此时运行一下:
发现:
执行成功了!(注意打印两个是对的哈,因为有个人名字一样,分组之后查的。)
其实看看编译之后的文件就知道了:
其实已经生成了我们想要的q文件,只是idea没有识别,so,让它识别一下就行了:
QueryDSL+gradle+idea
加上:
apply plugin: 'idea'
idea {
module {
sourceDirs += file('generated/')
}
}
很好理解,加上了idea的插件,然后将生成路径generated也作为源码路径。
完整demo如下:
apply plugin: 'java'
apply plugin: 'idea'
repositories {
jcenter()
}
idea {
module {
sourceDirs += file('generated/')
}
}
dependencies {
compile "com.mysema.querydsl:querydsl-jpa:3.6.3"
compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" // Magic happens here
compile "org.hibernate:hibernate-entitymanager:4.3.5.Final"
compile 'com.h2database:h2:1.4.187'
}
这里还是不行哦!
因为idea默认不进行annotation扫描,也就是说@entity它是不认的,所以要开启的:
打开file------other settings--------default setting:(注意最好是default settings,如果用普通的settings,只对当前项目生效,换个项目你还要重新配,多麻烦。。。)
然后找到annotation processors 勾上“enable annotation processing” 并且选择“model content root”:
选中项目,build一下:
然后就不会报错啦:
再看下生成的q文件:
最后说两句:
1.讲的详细是因为啰嗦。。。嫌弃的直接拿源码build一下就行了。源码在上面有贴出来哦,自己找下。
2.忘了。。。