我有一个Spring Boot项目,它有多个Model类
我想在DAO实现中使用多个模型类。
有人可以解释一下我如何在这里使用HQL查询。
我看到的大多数示例都使用CRUDRepository。但在我的理解中,这限制了我们一个模型类(如果我的理解是错误的,请纠正我)。
其次使用CRUDRepository限制了我非常具体的方法。但我需要的HQL查询可能更复杂,如:
Query query = session.createQuery(from Employee where name=:name and place=:place and phone=:phone and gender=:gender);
对于像这样的HQL查询,使用CRUDRepository是标准做法吗? 否则我怎么能使用这样的HQL查询。 (如果可能的话,还请添加我需要添加的所有依赖项和注释)。我正在使用Hibernate和postgres。
答案 0 :(得分:0)
CRUD存储库是编写DAO的标准方法。如果您查看文档,您将看到可以使用实体字段的复杂查询(这可能非常复杂,我建议您在查询方法部分查看here - 4.3),以及如果您想要更复杂的方法,可以在方法上使用注释@Query
:
@Repository
interface MyRepo implements JpaRepository<MyEntity,Long> {
@Query("your custom query here")
MyEntity findByFeature(String a)
}
现在,您可以在查询中插入查询并访问String a
(例如Select u where u.name="blabla"
,其中blabla
是您的输入字符串)
@Query
与存储库具有相同的依赖关系(我认为spring-boot-starter-data-jpa
就足够了)
答案 1 :(得分:0)
JpaRepository肯定很棒,但对于那些必须使用复杂的HQL查询的人(由于你的组织的推荐等),我就是这样做的:
通过在配置中注入以下bean来获取会话工厂:
@Bean public SessionFactory sessionFactory(@Qualifier(“entityManagerFactory”)EntityManagerFactory emf) { return emf.unwrap(SessionFactory.class); }
将EntityScan和ComponentScan添加到配置类
@EntityScan(basePackages = {“com.app.persistence”}) @ComponentScan(basePackages = {“com.app”})
继续使用任何HQL查询:
@Autowired SessionFactory工厂;
@Override
public String check() {
Session session = null;
try {
session = factory.openSession();
Query query = session.createQuery("from Test");
List<Test> res = query.list();
Test sing = res.get(0);
return sing.getName();
} catch (Exception e) {
System.out.println("Exception in Dao");
e.printStackTrace();
throw e;
} finally {
if (session != null) {
session.close();
}
}
}
注意:我假设已经完成了配置DataSource等所有其他事情。
如果我的理解或方式错误,任何人都可以随意纠正我。
但这样对我来说效果很好!! :)
答案 2 :(得分:0)
如果您希望在不使用存储库等的情况下执行动态HQL查询,这对我来说真的很不错:
@Autowired
EntityManager entityManager;
@RequestMapping("/query")
@ResponseBody
public String testQuery() {
Query query = entityManager.createQuery("select u from User u");
List<User> users = query.getResultList();
users.forEach(u -> System.out.println(u.getFirstname()));
return "See Console";
}
关于它的好处是,如果您快速想测试一个查询,并且正在使用Spring LiveReload,JRebel,DCEVM或带有Hybris的HotSwap之类的东西,则可以更改查询并保存并刷新。 / p>