【发布时间】:2015-08-16 20:05:33
【问题描述】:
我使用标准 JPA 实现已经有一段时间了,并且在创建由算法生成的动态查询以在数据库中搜索用户时没有遇到任何问题。但是,我们正在转向 Spring Framework(不幸的是,旧版本 - 3.2),我根本不知道如何在 Spring 中创建动态查询。
使用javax.persistance.EntityManager,我可以调用createQuery 并给它一个字符串以供使用。但是,我发现在 Spring 中,我只能使用类似以下代码的代码,在注释中定义查询。
@Repository
@SuppressWarnings("unused")
public interface PersonRepository extends JpaRepository<Person, Long>, CrudRepository<Person, Long> {
@Override
List<Person> findAll(Sort sort);
@Override
List<Person> findAll();
@Query("SELECT p FROM Person p ORDER BY p.lname ASC, p.fname ASC, p.mname ASC")
List<Person> findAllSort();
@Query("SELECT p FROM Person p WHERE UPPER(p.userName) = UPPER(?1)")
Person findPersonByUsername(String username);
}
这是我可以给你的最简单的动态查询示例,我想为 Spring 复制:
public List<Person> getPersons(List<Long> perIds) {
List<Person> persons;
String whereClause = "";
for (int i = 0; i < perIds.size(); i++) {
if (i != 0)
whereClause += " OR ";
whereClause += "p.perId = '" + perIds.get(i) + "'";
}
persons = em.createQuery("SELECT p FROM Person p WHERE " + whereClause).getResultList();
return persons;
}
也许一个更好的问题是问这是否可能,或者我是否应该只使用实体管理器保留我的实现。话虽如此,有人推荐我将我的代码从使用 EntityManager 更改为使用 Spring Framework 吗?
【问题讨论】:
-
你能澄清一下吗?也许提供一个你想要做什么的例子?当您说“从实体管理器更改为 Spring 框架”时……这对我来说没有任何意义,它们不是相互排斥的概念,甚至不一定相关。
-
我真正希望找到的是 Spring 可能有自己的“createQuery”方法实现,这样我就可以执行 JPA 或幼稚查询。但是,如果 Spring 不提供 createQuery 函数的自己的实现,我可以保留我当前的实现。
标签: spring spring-mvc jpa spring-data