 
Goal
- Criteria API
- CriteriaBuilder
- CriteriaQuery
Criteria API
Java Persistence Criteria API ๋ JPQL ์ ๋ฌธ์์ด ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ด์ฉํ๋ ๋์  ๊ฐ์ฒด ๊ธฐ๋ฐ ์ฟผ๋ฆฌ ์ ์ ๊ฐ์ฒด์ ๊ตฌ์ฑ์ ํตํด ๋์  ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค. Critera API ์๋ type-restricted mode, non-typed mode ๋ก ๋๋๋ฉฐ, ๋ฐํ์ ์ ๋์ ์ผ๋ก ์กฐํ ๋น๋๋ฅผ ์ง์ํด ์ปดํ์ผ๋ฌ๊ฐ ๊ฒ์ฆํ  ์ ์๋๋ก ํ๋ค. ๋ํ Criteria API ๋ ๋์  ์ฟผ๋ฆฌ์๋ง ์ฌ์ฉ๋์ด ๋ฉํ๋ฐ์ดํฐ ๋๋ Named Query ์์๋ ์ฌ์ฉํ  ์ ์์ผ๋ฉฐ ๋์  ์ฟผ๋ฆฌ์์๋ง ์ฌ์ฉํ  ์ ์์ด ๊ธฐ์กด์ ์ ์  Named Query ์ ๋นํด ์ฑ๋ฅ์ด ๋ฐ์ด๋์ง ์๋ค. ๊ทธ๋ฌํ ์ด์ ๋ก JPA Provider ๋ฅผ ํตํด ๊ตฌ๋ฌธ ๋ถ์ ์บ์์ ์ด์ ์ ์ป๋ JPQL ๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
(JPA 2.1 ๋ถํฐ CriteriaUpdate, CriteraiaDelete ๋ฅผ ์ง์ํ๋ค.)
CriteraBuilder
CriteraBuilder ๋ Critera API ์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ก, EntityManager ๋๋ EntityManagerFactory ๋ฅผ ํตํด getCriteriaBuilder() API ๋ฅผ ํธ์ถํ์ฌ Builer ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค. 
- createQuery()
- createQuery(Class)
- createTupleQuery()
- createCriteriaDelete(Class)
- createCriteriaUpdate(Class)
CriteriaQuery
CriteriaQuery ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Select Query ๋ฅผ ์ ์ํ๋ค. ๋ฐ๋ผ์ JPQL Select Query ์ ๋ชจ๋  ๊ตฌ๋ฌธ์ ๋ชจ๋ธ๋งํ๋ค.
CriteriaQuery ์์ฑ ์, ํด๋น ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋ ์์๋ ๋ค๋ฅธ CriteriaQuery ์์ ์ฌ์ฉํ  ์ ์์ผ๋ฉฐ, EntityManager ์ createQuery() ํจ์๋ฅผ ํตํด JPA ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋๋ค.
- distinct(Boolean)
- from(Class)
- from(EntityType)
- select(Selection)
- multiselect(Selection...)
- where(Expression)
- orderBy(Order...)
- groupBy(Expression...)
- having(Expression)
- subQuery(Class)
Example
@Component
class EBootCriteria(
    @PersistenceContext
    private val entityManager: EntityManager
) {
    fun getEBook(): List<EBook> {
        val criteriaBuilder = entityManager.criteriaBuilder
        val criteriaQuery = criteriaBuilder.createQuery(EBook::class.java)
        val root = criteriaQuery.from(EBook::class.java)
        val isEquals = criteriaBuilder.equal(root.get<String>("name"), "Clean Code")
        criteriaQuery.select(root)
            .distinct(true)
            .where(isEquals)
        val query: TypedQuery<EBook> = entityManager.createQuery(criteriaQuery)
        return query.resultList
    }
}