QueryDSL+gradle+idea

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 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结尾的打印。
然后,你们就会成功。。的发现编译报错啊:
QueryDSL+gradle+idea_第1张图片
缺少Q文件。。。
然而此时运行一下:

发现:
QueryDSL+gradle+idea_第2张图片
执行成功了!(注意打印两个是对的哈,因为有个人名字一样,分组之后查的。)
其实看看编译之后的文件就知道了:

其实已经生成了我们想要的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,只对当前项目生效,换个项目你还要重新配,多麻烦。。。)
QueryDSL+gradle+idea_第3张图片

然后找到annotation processors 勾上“enable annotation processing” 并且选择“model content root”:

QueryDSL+gradle+idea_第4张图片


选中项目,build一下:



然后就不会报错啦:

QueryDSL+gradle+idea_第5张图片

再看下生成的q文件:


最后说两句:
1.讲的详细是因为啰嗦。。。嫌弃的直接拿源码build一下就行了。源码在上面有贴出来哦,自己找下。
2.忘了。。。

你可能感兴趣的:(工具)