Postgresql 使用JPA在Spring中定制查询
我在这里创建了一个与教程类似的webapp: 我添加了postgresql数据库,一切正常。我在我的存储库中有一个基本的查询findByUsername(字符串名),它运行良好。我的问题是,由于某些原因,我无法创建自定义查询,例如Postgresql 使用JPA在Spring中定制查询,postgresql,jpa,spring-boot,h2,Postgresql,Jpa,Spring Boot,H2,我在这里创建了一个与教程类似的webapp: 我添加了postgresql数据库,一切正常。我在我的存储库中有一个基本的查询findByUsername(字符串名),它运行良好。我的问题是,由于某些原因,我无法创建自定义查询,例如 “选择当前时间戳” 假设我做了一个测试,我只想得到这个语句的值。我的意思是我不知道怎么做:) 我的谷歌搜索结果建议我把这个添加到我的类中 @Autowired 实体管理器实体管理器 然后对其创建查询。但是由于某些原因,entityManager从未初始化,因此始终返
“选择当前时间戳”
假设我做了一个测试,我只想得到这个语句的值。我的意思是我不知道怎么做:)
我的谷歌搜索结果建议我把这个添加到我的类中
@Autowired
实体管理器实体管理器代码>
然后对其创建查询。但是由于某些原因,entityManager
从未初始化,因此始终返回null。这样对吗?我只是错过了一些东西?还尝试添加spring boot starter jdbc
并使用JdbcTemplate,但也为空
编辑
我的问题是对春天的了解太少
我上过这样的课,并尝试在那里使用Autowire
public class Person {
@Autowire
MyRepo myRepo;
private String p;
public Person(String p) {
this.p = p;
}
正如我后来理解的那样,Spring并没有发现这一点。我在RestController中用personper=newperson(“string”)调用了这个类代码>。
我的解决方案是在我的RestController类中自动连接MyRepo,我的Person Constructor如下所示
public Person(String p, MyRepo myRepo) {
this.p = p;
this.myRepo = myRepo;
}
已删除“自动连线”个人类。通过这种方式,我成功地在Person类中初始化了myRepo并在那里使用它。这不是解决我问题的最好办法
我的第二个问题。在我完成这项工作后,我尝试将EntityManager自动连接到我的Person类。刚刚用EntityManager替换了MyRepo,它也被初始化了。现在问题是我的下一个代码行Integer i=(Integer)em.createNativeQuery(“选择1”,Integer.class).getSingleResult()代码>。这里我得到一个错误javax.persistence.PersistenceException:org.hibernate.MappingException:Unknown entity:java.lang.Integer。
此语句的目的是对my DB进行一个简单的查询,以确定它是否有响应。您不需要自动连接EntityManager
,Spring会为您处理所有这些
相反,您需要在存储库中定义一个新方法,并使用@Query
对其进行注释
例如:
@Query(value = "select current_timestamp from #{#entityName} u")
String findTimestamp();
您可以在spring文档中找到关于使用@Query
的更多信息:。最终的解决方案是:
Integer i = (Integer) em.createNativeQuery("select 1").getSingleResult();
刚刚从NatViveQueert中删除了Integer.class部分。我想,如果我想让它出现在那里,我应该为Integer创建一个新bean。
总的来说,这不是Spring中的最佳实践,但它解决了我的问题。为什么h2
标记?啊,忘了提到,也有h2依赖性。不知道这是否与此相关。@PersistenceContext EntityManager EntityManager代码>。JPA是一个相当复杂的野兽。Spring和Spring数据JPA是最重要的。在深入研究之前,您最好先阅读文档。尝试过之后,仍然返回null。您必须发布代码。是的,这是我想到的一种方法。但这意味着,我必须自动连接到某个特定的存储库。如果可能的话,寻找一种避免的方法。