将此MySQL查询转换为JPQL

时间:2013-12-30 21:09:36

标签: mysql jpql

我不确定这个MySQL查询在JPQL中的外观如何。 详情:

select title
from post
order by (
  select count(postId)
  from comment
  where comment.postId=post.id
) desc;

编辑: 张贴表格:

mysql> desc post;
+---------------+----------------+------+-----+---------+----------------+
| Field         | Type           | Null | Key | Default | Extra          |
+---------------+----------------+------+-----+---------+----------------+
| post_id       | int(11)        | NO   | PRI | NULL    | auto_increment |
| post_content  | varchar(50000) | NO   |     | NULL    |                |
| post_date     | datetime       | NO   |     | NULL    |                |
| post_summary  | varchar(1000)  | YES  |     | NULL    |                |
| post_title    | varchar(300)   | NO   |     | NULL    |                |
| post_visitors | int(11)        | NO   |     | NULL    |                |
| user_id       | int(11)        | NO   | MUL | NULL    |                |
| category_id   | int(11)        | NO   | MUL | NULL    |                |
+---------------+----------------+------+-----+---------+----------------+

评论表看:

mysql> desc comment;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| comment_id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| comment_content | varchar(600) | NO   |     | NULL    |                |
| comment_date    | datetime     | NO   |     | NULL    |                |
| comment_title   | varchar(300) | NO   |     | NULL    |                |
| user_id         | int(11)      | NO   | MUL | NULL    |                |
| post_id         | int(11)      | NO   | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

这是mysql中的命令,终端。

mysql> select post_title from post order by (select count(post_id) from comment where comment.post_id=post.post_id) desc;

我试过这个,但它不起作用:

SELECT p FROM Post p ORDER BY 
(SELECT c COUNT(c.getPost().getId()) 
from Comment c 
where c.getPost().getId()=p.getId()) 
desc

3 个答案:

答案 0 :(得分:1)

非工作方法的主要问题是从JPQL查询中调用Java类的方法 - 预计不会起作用。

假设实体的重要属性大致如下:

@Entity
public class Post {
    @Id int id;
    @OneToMany (mappedBy = "post") List<Comment> comments;
    //...
}

@Entity
public class Comment {
    @Id int id;
    @ManyToOne Post post;
    //...
}

然后关注Hibernate + MySQL组合就足够了:

SELECT p 
FROM Post p 
ORDER BY SIZE(p.comments) DESC

JPA 2.0规范要求更复杂的查询,因为ORDER BY子句中可以使用的内容相当有限:

  
      
  1. state_field_path_expression,其求值为实体的可订购状态字段或指定的可嵌入类抽象架构类型   在SELECT子句中,通过以下方式之一:•a   general_identification_variable•a   single_valued_object_path_expression
  2.   
  3. state_field_path_expression,其评估为同一实体的相同状态字段或可嵌入抽象模式类型   SELECT子句中的state_field_path_expression
  4.   
  5. 一个result_variable,它引用SELECT子句中的可订购项,并为其指定了相同的result_variable。这可能   是aggregate_expression,scalar_expression或a的结果   SELECT子句中的state_field_path_expression。
  6.   

以下查询也应该与其他实现一起使用。当然,附加变量是结果的一部分当然有点乏味:

SELECT p, SIZE(p.comments) as ord  
FROM Post p 
ORDER BY ord DESC

答案 1 :(得分:0)

我不使用JPQL,但也许这会起作用(你也可以在MySQL中使用它):

SELECT post_title, COUNT(c.post_id) AS c
FROM Post p
LEFT JOIN Comment c
ON p.post_id = c.post_id
ORDER BY c

答案 2 :(得分:0)

我使用原生SQL来获取我需要的结果。所以,它不是我的问题的答案,但我会发布我所做的,以及有效的方法(使用普通SQL)。 因为JPQL没有实现,named query中没有entity class,但native query已被使用(在DAO object的方法内)。

所以,这是方法内容:

public List<Post> getMostCommentedPosts(){
    Query q = em.createNativeQuery("select * from post order by "
            + "(select count(post_id) from comment where comment.post_id=post.post_id) desc", Post.class);
    List<Post> resultList = (List<Post>) q.getResultList();

    if (resultList.isEmpty())
        return null;
    else
        return resultList;
}