Utilisez QueryHint lors de L'utilisation de JpaSpecificationExecutor
j'utilise les données du ressort et la méthode JpaSpecificationExecutor::findAll
pour récupérer mes modèles. Comment puis-je utiliser des indices de requête lors de l'appel de cette méthode?
Le code source ci-dessus fonctionne très bien mais je ne peux pas définir QueryHint pour mon fournisseur JPA (dans mon cas EclipseLink).
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product> {
}
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> findByTitle(String locale, String titleToSearch) {
return productRepository.findAll((Root<ProductCategory> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
return builder.equal(builder.function("jsonb_extract_path_text", String.class, root.<String>get("title"), builder.literal(locale)), titleToSearch);
});
}
}
La façon dont j'utilise les indicateurs de Requête à l'aide de printemps-les données ci-dessus,
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product> {
@QueryHints(value = {
@QueryHint(name = org.eclipse.persistence.config.QueryHints.BATCH_TYPE, value = "JOIN"),
@QueryHint(name = org.eclipse.persistence.config.QueryHints.BATCH, value = "p.productCategory"),
@QueryHint(name = org.eclipse.persistence.config.QueryHints.BATCH, value = "p.productFileList")
}, forCounting = false)
@Query("SELECT p FROM Product p")
public List<Product> find();
}
j'ai aussi trouvé ce qui n'est pas résolu encore.
1 réponses
quand je veux créer une requête en utilisant des données de printemps, je suis l'algorithme ci-dessus.
1) est la requête déjà fournie par les interfaces existantes de printemps-données comme
CrudRepository
,PagingAndSortingRepository
,JpaRepository
etc?
Exemples:saveAndFlush
oufindAll
méthodes, plus dans docs .
Product product = new Product();
// Setters..
productRepository.saveAndFlush();
2) Puis-je créer une méthode en utilisant des mots-clés à l'intérieur des noms de méthode?
Exemples: count , plus dans docs .
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer> {
Long countByTitle(String title);
List<Product> findByTitleLikeAndVisible(String title, boolean visible);
}
3) Puis-je créer une méthode de requête personnalisée en écrivant JPQL?
Exemples: docs .
Dans ce cas, les données de printemps n'essayez pas de créer la requête en utilisant des mots-clés à l'intérieur des noms de méthode, de sorte que les noms de méthode peuvent être ce que vous voulez.
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer> {
@Query("SELECT COUNT(p) FROM Product p WHERE p.title=?1")
Long countByTitle(String title);
@Query("SELECT p FROM Product p WHERE p.title LIKE :title AND visible=true")
List<Product> findByTitleLikeAndVisibleTrue(@Param("title") String title);
}
4) est-ce que je veux des noms de colonnes variables ou des variables où les conditions? Alors la solution est la Spécification.
Exemple: docs , afin de répondre à
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product> {
}
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> findByColumn(String columnName, Object value) {
return productRepository.find((Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
return builder.and(builder.equal(root.<String>get(columnName), value));
});
}
}
5) est-ce que je veux plus? la solution est d'obtenir L'EntityManager et de l'utiliser comme je l'ai utilisé sans la bibliothèque de données de ressort. (C'est la réponse à cette question)
Exemple: ainsi répondre , plus dans docs
// Create an interface and add the methods you wish to use with EntityManger.
public interface ProductRepositoryExt {
public List<Product> findByTitle(String title);
}
// Implement the interface you created. Be careful the class name must be identical to the spring-data @Repository interface with the "Impl" appended.
public class ProductRepositoryImpl implements ProductRepositoryExt {
@PersistenceContext
private EntityManager em;
@Override
public List<Product> findByTitle(String title) {
// em.getTransaction().begin();
String sql = "SELECT p FROM Product p WHERE p.title=:title')";
TypedQuery<ProductCategory> query = em.createQuery(sql, Product.class);
query.setParameter("title", title);
// Add the query hints you wish..
query.setHint(org.eclipse.persistence.config.QueryHints.BATCH_TYPE, "JOIN");
query.setHint(org.eclipse.persistence.config.QueryHints.BATCH, "p.productCategory");
return query.getResultList();
// em.getTransaction().commit();
}
}
// Extend this interface from your spring-data @Repository interface.
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, ProductCategoryRepositoryExt {
}