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