我不确定这个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
答案 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子句中可以使用的内容相当有限:
- state_field_path_expression,其求值为实体的可订购状态字段或指定的可嵌入类抽象架构类型 在SELECT子句中,通过以下方式之一:•a general_identification_variable•a single_valued_object_path_expression
- state_field_path_expression,其评估为同一实体的相同状态字段或可嵌入抽象模式类型 SELECT子句中的state_field_path_expression
- 一个result_variable,它引用SELECT子句中的可订购项,并为其指定了相同的result_variable。这可能 是aggregate_expression,scalar_expression或a的结果 SELECT子句中的state_field_path_expression。
醇>
以下查询也应该与其他实现一起使用。当然,附加变量是结果的一部分当然有点乏味:
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;
}