是否有 spring jpa 等同于以下查询

Is there any spring jpa equivalent to following query

查询:

@Query("Select p.name,t.points from Player p,Tournament t where t.id=?1 And p.id=t.player_id")

我有我的玩家和锦标赛实体及其相应的 JPA 存储库。但问题是我们只能从查询中获取实体,但我想执行上述查询,请帮助我,我是新手。

这是我要添加的 sql 查询,但我不知道要添加到哪里:

Select p.name, t.points_rewarded from player p, participant t where t.tournament_id="1" and t.player_id=p.id;

这是使用 JPA 的 JPQL 的方法:

String queryString = "select p.name, t.points from Tournament t," +
            " Player p where t.player_id=p.id " +
            "and t.id= :id_tournament";

Query query = this.entityManager.createQuery(queryString);
query.setParameter("id_tournament", 1);
List results = query.getResultList();

您可以查看此 JPA Query Structure (JPQL / Criteria) 以了解有关 JPQL 查询的更多信息。


你可以使用 HQL for Hibernate,这有两种实现方式:

String hql = "SELECT p.name, t.points from Player p,Tournament t WHERE t.id= '1' And p.id=t.player_id";
Query query = session.createQuery(hql);
List results = query.list();

或者像这样使用query.setParameter()方法:

String hql = "SELECT p.name, t.points from Player p,Tournament t WHERE t.id= :tournament_id And p.id=t.player_id";
Query query = session.createQuery(hql);
query.setParameter("tournament_id",1);
List results = query.list();

您可以查看此 HQL Tutorial 以了解有关 HQL 查询的更多信息。


注:

在这两种情况下,您将获得对象数组 List<Object[]> 的列表,其中第一个元素 array[0]p.name,第二个元素是 t.points.

TypedQuery instead of normal Query in JPA 这就是我一直在寻找的,感谢 chsdk 的帮助,我必须创建 pojos class,并且在上面 link 答案对我来说工作正常, 这是我的代码示例

String querystring = "SELECT new example.restDTO.ResultDTO(p.name,t.pointsRewarded) FROM Player p, Participant t where t.tournamentId=?1 AND t.playerId = p.id ORDER by t.pointsRewarded DESC";
EntityManager em = this.emf.createEntityManager();
try {
 Query queryresults =  em.createQuery(querystring).setParameter(1, tournamentId);
 List<ResultDTO> result =queryresults.getResultList();
 return new ResponseEntity<>(result, HttpStatus.OK);
} catch (Exception e) {
 e.printStackTrace();
 return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
} finally {
if (em != null) {
 em.close();
 }}