介绍

QueryDsl 是一个针对Java的面向对象查询的工具,支持的模块有JPA,SQL,Mongodb,JDO,Lucense,集合。

sample

List<Person> persons = queryFactory.selectFrom(person) //person 是querydsl 的域对象
  .where(
    person.firstName.eq("John"),
    person.lastName.eq("Doe"))
  .fetch();

Gradle 配置 Kotlin使用QueryDsl

直接把配置文件放出来,这个配置是ok的

buildscript {
  ext.kotlin_version = '1.1.2-5'

  repositories {
    mavenCentral()
  }

  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
apply plugin: 'idea'

dependencies {
  .....
  compile 'com.querydsl:querydsl-jpa:4.2.1'
  kapt "com.querydsl:querydsl-apt:4.2.1:jpa" // 使用kapt 激活querydsl apt工具
  ....
}

repositories {
  jcenter()
}

生成QxxModel文件

使用gradle build 一下就自动会在build文件夹下自动生成QxxModel文件。

QueryDsl Spring Boot JPA 分页查询

主要是在 service 和 dao 上做修改

ServiceImpl.kt

@Service
class CheckInfoServiceImpl : CheckInfoService {

    //实体管理
    @Autowired
    private lateinit var entityManager : Provider<EntityManager>

    //查询工厂
    private  lateinit var queryFactory: JPAQueryFactory

    //初始化查询工厂
    @PostConstruct
    fun init()
    {
        queryFactory = JPAQueryFactory(entityManager);
    }

    override fun findPositive(searchCheckDto: SearchCheckDto, pageable: Pageable): PageImpl<Map<String, String>> {
        val qm = QCheckInfoModel.checkInfoModel
        //动态条件
        val predicate = qm.pass.eq("0").and(qm.orgCode.like(OrgCodeUtils.getSQLCondition(searchCheckDto.orgCode)))
        if (searchCheckDto.name.isNotEmpty()) {
            predicate.and(qm.name.like("%${searchCheckDto.name}%"))
        }
        val list = mutableListOf<Map<String,String>>()
        val fetch = queryFactory.select(
                // 查询指定列
                qm.id,
                qm.name,
                qm.idCardNo,
                qm.nation,
                qm.sex,
                qm.score)
                .from(qm)
                .where(predicate)
                .orderBy(qm.createDate.desc())
                .offset(pageable.getOffset().toLong())
                .limit(pageable.getPageSize().toLong())
                .fetch()
        fetch.forEach {
            val data = mutableMapOf<String,String>()
            data.put("id" , it.get(qm.id).toString())
            data.put("name" , it[qm.name]?:"")
            data.put("idcard", it[qm.idCardNo]?:"")
            data.put("nation", it[qm.nation]?:"")
            data.put("sex", it[qm.sex].toString()?:"")
            data.put("score", it[qm.score]?:"")
            list.add(data)
        }

        val count =  queryFactory.select(qm.id)
                .from(qm)
                .where(predicate)
                .fetchCount()

        return PageImpl(list,pageable ,count)
    }
}

Dao.kt

@Repository
interface CheckInfoDao : JpaRepository<CheckInfoModel, Long>,QueryDslPredicateExecutor<CheckInfoModel> //增加 QueryDslPredicateExecutor