我使用spring数据和JpaSpecificationExecutor::findAll
方法来获取模型。调用此方法时如何使用查询提示?
上面的源代码工作正常,但是我不能为我的JPA提供程序(在我的情况下为EclipseLink)设置QueryHint。
@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);
});
}
}
以上是我使用spring-data使用查询提示的方式,
@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();
}
我还发现了这个尚未解决的问题。
当我想使用spring-data创建查询时,请遵循上述算法。
1)是否已经提供的查询
通过弹簧数据等的现有接口CrudRepository
,PagingAndSortingRepository
,JpaRepository
等?
示例:saveAndFlush
或findAll
方法,更多内容参见docs。
Product product = new Product();
// Setters..
productRepository.saveAndFlush();
2)我可以在方法名称中使用关键字创建方法吗?
示例:count,更多内容在docs中。
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer> {
Long countByTitle(String title);
List<Product> findByTitleLikeAndVisible(String title, boolean visible);
}
3)我可以创建编写JPQL的自定义查询方法吗?
示例:docs。
在这种情况下,spring数据不会尝试使用方法名称中的关键字来创建查询,因此方法名称可以是您想要的任何名称。
@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)我想要变量列名还是变量条件? 那么解决方案就是规范。
示例:docs,所以回答
@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)我想要更多吗? 解决方案是获取EntityManager并使用它,就像我在没有spring数据库的情况下使用它一样。
(这是对此问题的答案)
示例:so answer,更多文档
// 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 {
}
我正在使用创建自定义查询。如何为以下SQL创建规范? Java类:
我使用spring数据和方法获取模型。调用此方法时如何使用查询提示 上面的源代码运行良好,但我无法为我的JPA提供者(在我的例子中是EclipseLink)设置QueryHint。 我使用spring数据使用查询提示的方式如下:, 我也发现这个还没有解决。
有没有办法在使用 jongo 查询 MongoDB 时添加 ?我发现这样的错误 - '排序超出了 104857600 字节的内存限制,但没有选择加入外部排序。正在中止操作。传递 allowDiskUse:true 可以选择加入,可以通过以下方式阻止,您的聚合看起来像 但据我所知,Jongo 中的类仅将管道应用于自身,然后您可以使用 方法执行。 是否有任何方法可以将该参数传递给mongo而不从Jon
无法对JpaSpecificationExecutor存储库使用findAll(规范,分页)方法。我将存储库接口设置为: 每当我调用EmployeeRepository.findall(规范,分页)时;抛出此错误: 这是StackTrace: 完整代码:https://github.com/sanketkd/specificationexecutor 存储库:
问题内容: 我一直在nodejs中编程,研究了如何同时使用socket.io和对节点服务器的ajax调用。socket.io是否设计为替代ajax?我很好奇,在哪种情况下使用socket.io更好,而哪种ajax更好。感谢您的输入。 问题答案: 好吧,Web套接字(通过socket.io)提供的主要内容之一就是ajax缺乏的是服务器推送。因此,对于ajax,如果您想了解服务器上的新事件(例如,另一
(使用Spring Data JPA)我有两个实体和,它们之间具有一个或多个或多个双向关系。我将添加到父实体,如下所示: 请注意,父级子级的fetch类型是lazy的。这是故意的。当我询问个别家长时,我不想总是急切地加载孩子。通常情况下,我可以使用我的命名实体图来按需加载孩子们。但是..... 有一个特定的情况,我想查询一个或多个家长和迫切加载他们的孩子。除此之外,我还需要能够以编程方式构建这个查