Giriş
QueryDSL dinamik sorguları kolaylaştırır.
1. Maven veya gradle dependency eklenir
2. JPA Entity tanımlanır
3. Q Sınıfları için kod üretilir
4. QuerydslPredicateExecutor sınıfından kalıtan bir repository yaratılır veya
JPAQueryFactory direkt kullanılır
Örnek
Şöyle yaparız
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Query DSL --><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId></dependency><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId></dependency>
Örnek
Şöyle yaparız. Burada querydsl-apt provided olarak belirtiliyor.
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
Maven Plugin
Örnek - JPAAnnotationProcessor
Şöyle yaparız
<plugin><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><goals><goal>process</goal></goals><configuration><outputDirectory>target/generated-sources/java</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions></plugin>
Kod üretmek için şöyle yaparız
mvn clean compile
JPAQueryFactory Kullanımı
Örnek
Şöyle yaparız
mport com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository public class PersonRepository { @Autowired private EntityManager entityManager; public List<Person> findPeopleByLastName(String lastName) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); QPerson person = QPerson.person; return queryFactory.selectFrom(person) .where(person.lastName.eq(lastName)) .fetch(); } }
import com.querydsl.jpa.impl.JPAQueryFactory; @SpringBootTest @ActiveProfiles("test") @Transactional public class PersonRepositoryTest { @Autowired private PersonRepository personRepository; @Autowired private EntityManager entityManager; @Test void testFindPeopleByLastName() { Person person1 = new Person(); person1.setFirstName("John"); person1.setLastName("Smith"); entityManager.persist(person1); Person person2 = new Person(); person2.setFirstName("Jane"); person2.setLastName("Doe"); entityManager.persist(person2); List<Person> result = personRepository.findPeopleByLastName("Smith"); assertThat(result).hasSize(1); assertThat(result.get(0).getFirstName()).isEqualTo("John"); assertThat(result.get(0).getLastName()).isEqualTo("Smith"); } }
QuerydslPredicateExecutor Kullanımı
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.DatePath;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.PathBuilder;
import com.querydsl.core.types.dsl.StringPath;
gibi sınıflar ile bir path yaratılır
Örnek
Bir örnek burada.
Örnek
Elimizde şöyle bir Entity olsun
import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import com.vladmihalcea.hibernate.type.json.JsonType; import lombok.Data; @Entity @Table(name = "abhi_roles") @Data @TypeDef(name = "json", typeClass = JsonType.class) public class Roles implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "employeeId", length = 10) private String employeeId; @Column(name = "username") private String username; @Type(type = "json") @Column(name = "roles", columnDefinition = "json") private List<String> roles; }
Şöyle yaparız
import org.springframework.data.querydsl.QuerydslPredicateExecutor;@Repository public interface RolesRepository extends JpaRepository<Roles, String>, QuerydslPredicateExecutor<Roles> { }
Service kısmında şöyle yaparız
import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; @Service public class RolesService { @Autowired RolesRepository repository; public List<Roles> findUsersWithRoles(String role) { QRoles userRolesPath = QRoles.roles1; BooleanExpression exp = Expressions .booleanTemplate("json_contains_key({0}, {1})", userRolesPath.roles, Expressions.constant(role)) .isTrue(); Iterable<Roles> lr = repository.findAll(exp);
List<Roles> result = new ArrayList<>(); lr.forEach(result::add); return result; } }
Hiç yorum yok:
Yorum Gönder