使用JPA

时间:2017-03-01 11:36:07

标签: postgresql jpa spring-boot h2

我创建了一个类似于本教程的webapp: https://spring.io/guides/tutorials/react-and-spring-data-rest/

我添加了postgresql db,一切正常。我的存储库中有一个基本查询findByUsername(String name),工作正常。我的问题是,我出于某种原因无法创建自定义查询,例如

"SELECT CURRENT_TIMESTAMP"

让我说我做一个测试,我只想得到这个陈述的价值。而且我无法理解我不知道如何:)

我的谷歌搜索结果建议我将其添加到我的班级

@Autowired EntityManager entityManager;

然后在其上创建查询。但entityManager由于某种原因从未初始化,始终返回null。这是正确的方式,我只是缺少一些东西?还试图添加spring-boot-starter-jdbc并使用JdbcTemplate,但也是null。

修改

我的问题是对Spring的了解太少。

我有一个这样的课程,并试图在那里使用Autowire。

public class Person {
@Autowire
MyRepo myRepo;
private String p;
public Person(String p) {
    this.p = p;
}

正如我后来所理解的那样,Spring并未接受这一点。我在一个带有Person per = new Person("string");的RestController中调出了这个类。 我做的解决方案是在我的RestController类中使用Autowire MyRepo,我的Person contstructor看起来像这样

public Person(String p, MyRepo myRepo) {
this.p = p;
this.myRepo = myRepo;
}

删除了Person类中的autowire。这样我设法在Person类中初始化myRepo并在那里使用它。这不是我问题的最佳选择。

我的第二个问题。在我完成这项工作之后,我尝试将EntityManager自动装配到我的Person类。刚刚用EntityManager替换了MyRepo,它也被初始化了。现在问题在于我的下一个代码行 Integer i = (Integer) em.createNativeQuery("select 1", Integer.class).getSingleResult();。这里我得到一个错误 javax.persistence.PersistenceException:org.hibernate.MappingException:未知实体:java.lang.Integer 。 此语句的目的是对我的数据库进行简单查询,如果它响应。

2 个答案:

答案 0 :(得分:0)

您不需要自动装配EntityManager,Spring会为您处理所有这些事情。

而是在您的存储库中,您需要定义一个新方法并使用@Query对其进行注释。

示例:

@Query(value = "select current_timestamp from #{#entityName} u")
String findTimestamp();

您可以在春季文档中找到有关使用@Query的更多信息:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

答案 1 :(得分:0)

最终解决方案是:

Integer i = (Integer) em.createNativeQuery("select 1").getSingleResult();

刚从NatviveQuert中删除了Integer.class部分。我想,如果我想要它在那里,我应该为Integer制作一个新的bean 总的来说,这不是Spring的最佳实践,但它解决了我的问题。