Langsung ke konten utama

Spring Boot Querydsl

Description

Querydsl adalah library Java yang memungkinkan pengembang untuk membuat query database yang aman dan kuat menggunakan sintaks yang deklaratif dan berbasis kode. Dengan Querydsl, pengembang dapat menghasilkan query database dengan menggunakan struktur objek Java, menghindari kesalahan penulisan string SQL dan meningkatkan keamanan dan fleksibilitas query.

Kelebihan

1. Sintaks yang deklaratif: Querydsl menggunakan sistaks berbasis kode yang deklaratif untuk membangung query database, sehingga mengurasngi risiko kesalahan penulisan string SQL dan meningkatkan kualitas kode.
2. Tipe Aman: Querydsl menggunakan tipe aman dalam membangun query, yang berarti kesalahan pada waktu kompilasi dapat dideteksi lebih awal dan mengurangi kesalahan pada waktu runtime.
3. Integrasi dengan framework populer: Querydsl dapat dengan mudah diintegrasikan dengan berbagai kerangka kerja populer seperti Spring Framework, Hibernate, JPA, dan lainnya.
4. Dukungan untuk berbagai jenis database: Querydsl mendukung berbagai jenis database seperti Mysql, PostgreSQL, Oracle, dan lainnya sehingga dapat digunakan dalam lingkungan pengembangan yang beragam 
5. Fitur-fitur lanjutan: Querydsl juga menyediakan fitur-fitur lanjutan seperti penggabungan query, operasi CRUD, pengurutan dan pembatasan hasil query, yang mempermudah pengembangan aplikasi database yang kompleks.

Kekurangan Querydsl

1. Kurva Belajar: Menggunakan querydsl memerpukan pemahaman yang baik tentang sintaks dan komsepnya, sehingga memerlukan waktu untuk belajar dan mempelajarinya.
2. Performa: Terkadang menggunakan querydsl dapat mempengaruhi performa karena adanya lapisan tambahan antara aplikasi dan database. Namun, pengaruh ini dapat diminimalisir dengan penggunaan yang bijaksana dan pengeoptimalan query yang tepat.


Cara menambahkan Querydsl di Spring Boot

tambahkakn liblary ini pada pom.xml
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
<classifier>jakarta</classifier>
</dependency>

<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
jika kalian menggunakan java yang dibawah 17 hapus <classifier>jakarta</classifier>

setelah itu tambahkan plugin 

<!--Plugin for query-dsl-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>


jadinya akan seperti ini

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fluex404</groupId>
<artifactId>spring-boot-querydsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-querydsl</name>
<description>spring-boot-querydsl</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
<classifier>jakarta</classifier>
</dependency>

<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>

<!--Plugin for query-dsl-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<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>

</project>

Nah sekarang coba configurasi database disini saya menggunakan postgresql tambahkan configurasi ini ke application.yaml, sorry sebelumnya kan applicatoin.properties nah disitu kalian rubah formatnya dulu jadi .yaml biar lebih enak penulisannya kalau udah tambahkan configurasinya
spring:
initialization-mode: always
datasource:
username: postgres
password: password
url: jdbc:postgresql://192.168.8.103:5432/test
jpa:
hibernate:
ddl-auto: update
lalu buat entity disini saya buat tabel simple aja ada 3 yaitu Book, Borow, UserData saya menggunaakn sistem peminjaman buku dimana jika ingin menyimpan data buku taruh di entity Book dan jika ingin menyimpan data User taruh di entity UserData dan jika ingin menyimpan data Peminjaman yang mana ada buku apa yang dipinjam dan user siapa yang pinjam itu di Borrow. buat seperti ini ya guys

import jakarta.persistence.*;
import lombok.*;

@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
}

import jakarta.persistence.*;
import lombok.*;

@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "userdata")
public class UserData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "borrow")
public class Borrow {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private UserData userData;
@ManyToOne
@JoinColumn(name = "book_id", referencedColumnName = "id")
private Book book;
@Column(columnDefinition = "TIMESTAMPTZ", name = "insert_date")
private LocalDateTime insertDate;
}
lihat kode import diatas saya menggunakan jakarta.persistence.* itu karna saya menggunakan java 17 jika kalian dibawah java 17 itu ganti java.persistence

isi datanya dengan query manual ke database

insert into public.userdata (id, email, name)

values  (1, 'abc@gmail.com', 'abc'),

        (2, 'test1@gmail.com', 'test1'),

        (3, 'test2@gmail.com', 'test2');


insert into public.book (id, author, title)

values  (1, 'isa', 'programming with assembly'),

        (2, 'josh', 'programming with ep ha ep');


insert into public.borrow (id, book_id, user_id, insert_date)

values  (3, 2, 3, '2023-05-20 11:18:09.405000 +00:00'),

        (1, 1, 1, '2023-05-14 11:18:07.192000 +00:00'),

        (2, 1, 2, '2023-05-19 11:18:12.810000 +00:00');


jika data dan entitynya sudah siap kalian sudah bisa menggunakan querydsl, disini saya mengagunakan unit testing dari spring boot
import com.fluex404.springbootquerydsl.entity.QBook;
import com.fluex404.springbootquerydsl.entity.QBorrow;
import com.fluex404.springbootquerydsl.entity.QUserData;
import com.fluex404.springbootquerydsl.respository.UserDataRepository;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.jpa.impl.JPAQuery;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import java.time.LocalDateTime;
import java.util.List;

@SpringBootTest
class SpringBootQuerydslApplicationTests {
@Autowired
UserDataRepository userDataRepository;
@PersistenceContext
private EntityManager entityManager;

@Test
void ngetest_aja() {
System.out.println("NGETEST AJA!");
}

@Test
void ngetest_find_all_userdata() {
var qUserData = QUserData.userData;
var query = new JPAQuery(entityManager);

query.from(qUserData).fetch().forEach(System.out::println);
}

@Test
void ngetest_find_all_userdata_with_where() {
var qUserData = QUserData.userData;
var query = new JPAQuery(entityManager);

query.from(qUserData).where(qUserData.name.like("%test%"));

query.where(qUserData.email.eq("test1@gmail.com"));

query.fetch().forEach(System.out::println);
}

@Test
void ngetest_where_localdatetime() {
var qBorrow = QBorrow.borrow;
var query = new JPAQuery(entityManager);

query.from(qBorrow).where(qBorrow.insertDate.after(LocalDateTime.of(2023, 05, 18, 0, 0, 0))
.and(qBorrow.book.title.eq("programming with assembly")));
query.fetch().forEach(System.out::println);
}

@Test
void ngetest_querydsl_on_repository_userdata() {
var qUserData = QUserData.userData;
userDataRepository.findAll(
qUserData.name.like("%test%"),
qUserData.id.desc()
).forEach(System.out::println);
}

@Test
void ngetest_querydsl_with_pageable() {
var qUserData = QUserData.userData;
userDataRepository.findAll(
PageRequest.of(1, 1, Sort.by("email").descending())
).forEach(System.out::println);
}

@Test
void ngetest_querydsl_with_two_books() {
var book1 = QBook.book;
var book2 = QBook.book;
var query = new JPAQuery(entityManager);

query.from(book1, book2).where(book1.author.eq("isa").or(book2.author.eq("josh")));

query.fetch().forEach(System.out::println);
}

@Test
void cobain_tuple() {
var qBook = QBook.book;
var query = new JPAQuery(entityManager);


NumberPath<Long> aliasKuda = Expressions.numberPath(Long.class, "kuda");
query.select(qBook.id, qBook.title, qBook.author, qBook.id.multiply(100).as(aliasKuda))
.from(qBook)
.orderBy(aliasKuda.desc())
;

// query.fetch().forEach(System.out::println);
List<Tuple> list = query.fetch();
for (Tuple tuple : list) {
System.out.println(tuple);
System.out.println(tuple.get(3, Integer.class));
}

}

@Test
void cobain_Qcustome() {
var qBook = new QBook("book");
var qCustomer = new QBook("customer");
var query = new JPAQuery(entityManager);

query.from(qBook).fetch().forEach(System.out::println);
query.from(qCustomer).fetch().forEach(System.out::println);

}
}


Komentar

Postingan populer dari blog ini

whois

  Pengertian:  whois adalah tools yang digunakan untuk melihat informasi mengenai kepemilikan domain dan website. ICANN meregulasikan domain name dan kepemelikian, tapi record listnya di adakan di semua company dikenal sebagai registrasi.  jadi orang bisa query list of records, dan register akan menghandle request anda dan mengirim detail dari whois record yang sesuai. How to Install whois :  sudo apt-get install whois How to use:  whois cnn.com dan hasilnya akan seperti ini. Domain Name: CNN.COM Registry Domain ID: 3269879_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.corporatedomains.com Registrar URL: http://www.cscglobal.com/global/web/csc/digital-brand-services.html Updated Date: 2018-04-10T16:43:38Z Creation Date: 1993-09-22T04:00:00Z Registry Expiry Date: 2026-09-21T04:00:00Z Registrar: CSC Corporate Domains, Inc. Registrar IANA ID: 299 Registrar Abuse Contact Email: domainabuse@cscglobal.com Registrar Abuse Contact Phone: 8887802723 Domain Status: clien...

Membuat export dan import Excel di spring boot

Membuat export dan import Excel  di spring boot           Adakalanya seorang developer diminta untuk membuat fitur export dan import berbentuk excel dan sebenarnya java sudah menyediakan suatu liblary yang memudahkan kita untuk bekerja dengan MS-Office yaitu Apache POI. Disini saya akan menggunakan Apache POI untuk membaca dan menulis Excel. Catatan : Disini saya sarankan untuk belajar Apache POI Excel terlebih dahulu agar anda mengerti kode yang saya buat di bawah ini. Bahan : -  IntelliJ IDEA -  PostgreSQL -  Maven -  Java 8 Jika sudah tersedia bahan - bahan di atas langsung saja kunjungi situs ini Tambahkan dependency Apache POI di pom.xml seperti di bawah ini. <?xml version="1.0" encoding="UTF-8"?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0...

Cara dualboot phoenix os dengan Linux Mint, Ubuntu

Cara dualboot phoenix os dengan Linux Mint, Ubuntu               PhonixOS adalah system operasi base android, yang membuat komputer kita sebagai android dengan tampilan desktop yang elegan, dan sangat frendly sumber daya. Disini saya akan share cara dualboot phoenix os dengan Linux mint atau ubuntu dan tuturanan lainnya. Bahan : - PhoenixOs (Download yang format .iso) - Ubuntu atau Linux mint Cara : extract os phoenix yang benbentuk .iso seperti ini Buka terminal lalu ketikan perintah dibawah ini. sudo mkdir /phoenix   sudo cd /phoenix sudo thunar lalu pindah file yang tadi sudah di extart ke /phoenix os yang sudah open as root open terminal lagi dan ketikan sudo dd if=/dev/zero of=/phoenix/data.img bs=1M count=32768 lalu ketikan  sudo mkfs.ext4 /phoenix/data.img  dan setelah kita selesai install phoenix os kita blum membuat grub untuk mmebuat pilihan...