我创建了一个类似于本教程的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 。
此语句的目的是对我的数据库进行简单查询,如果它响应。
答案 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的最佳实践,但它解决了我的问题。