首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将此MySQL查询转换为JPQL

将此MySQL查询转换为JPQL
EN

Stack Overflow用户
提问于 2013-12-30 21:09:36
回答 3查看 140关注 0票数 0

我不知道这个MySQL查询在JPQL中会是什么样子。详情:

代码语言:javascript
复制
select title
from post
order by (
  select count(postId)
  from comment
  where comment.postId=post.id
) desc;

编辑:投递表外观:

代码语言:javascript
复制
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    |                |
+---------------+----------------+------+-----+---------+----------------+

注释表查看:

代码语言:javascript
复制
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中的命令终端。

代码语言:javascript
复制
mysql> select post_title from post order by (select count(post_id) from comment where comment.post_id=post.post_id) desc;

我试过了,但没用:

代码语言:javascript
复制
SELECT p FROM Post p ORDER BY 
(SELECT c COUNT(c.getPost().getId()) 
from Comment c 
where c.getPost().getId()=p.getId()) 
desc
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-02 19:27:16

我使用了本地SQL来获得我需要的结果。所以,这并不是我的问题的真正答案,但我会张贴我做了什么,什么工作(与普通SQL)。因为,它不是用JPQL实现的,所以entity class中没有named query,但是已经使用了native query (在DAO object方法中)。

因此,这是方法内容:

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2013-12-31 16:27:30

非工作方法的主要问题是从JPQL查询调用Java类的方法--这是不可能的。

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

代码语言:javascript
复制
@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组合体应该就足够了:

代码语言:javascript
复制
SELECT p 
FROM Post p 
ORDER BY SIZE(p.comments) DESC

JPA2.0规范需要更复杂的查询,因为可以按ORDER子句使用的查询非常有限:

  1. 计算结果为实体的可排序状态字段或SELECT子句中指定的可嵌入类抽象模式类型的state_field_path_expression:.a general_identification_variable·a single_valued_object_path_expression之一
  2. 计算结果为同一实体的相同状态字段的state_field_path_expression,或与SELECT子句中的state_field_path_expression相同的可嵌入抽象模式类型。
  3. result_variable,它引用已为其指定相同result_variable的SELECT子句中的可排序项。这可能是SELECT子句中的aggregate_expression、scalar_expression或state_field_path_expression的结果。

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

代码语言:javascript
复制
SELECT p, SIZE(p.comments) as ord  
FROM Post p 
ORDER BY ord DESC
票数 1
EN

Stack Overflow用户

发布于 2013-12-30 21:33:02

我不使用JPQL,但这可能会奏效(您也可以在MySQL中使用它):

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20847624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档