Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用JPA在Spring中定制查询_Postgresql_Jpa_Spring Boot_H2 - Fatal编程技术网

Postgresql 使用JPA在Spring中定制查询

Postgresql 使用JPA在Spring中定制查询,postgresql,jpa,spring-boot,h2,Postgresql,Jpa,Spring Boot,H2,我在这里创建了一个与教程类似的webapp: 我添加了postgresql数据库,一切正常。我在我的存储库中有一个基本的查询findByUsername(字符串名),它运行良好。我的问题是,由于某些原因,我无法创建自定义查询,例如 “选择当前时间戳” 假设我做了一个测试,我只想得到这个语句的值。我的意思是我不知道怎么做:) 我的谷歌搜索结果建议我把这个添加到我的类中 @Autowired 实体管理器实体管理器 然后对其创建查询。但是由于某些原因,entityManager从未初始化,因此始终返

我在这里创建了一个与教程类似的webapp:

我添加了postgresql数据库,一切正常。我在我的存储库中有一个基本的查询findByUsername(字符串名),它运行良好。我的问题是,由于某些原因,我无法创建自定义查询,例如

“选择当前时间戳”

假设我做了一个测试,我只想得到这个语句的值。我的意思是我不知道怎么做:)

我的谷歌搜索结果建议我把这个添加到我的类中

@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。您必须发布代码。是的,这是我想到的一种方法。但这意味着,我必须自动连接到某个特定的存储库。如果可能的话,寻找一种避免的方法。