将此MySQL查询转换为JPQL
我不确定这个MySQL查询在JPQL中会是什么样子。 详情: 编辑: 表后外观:将此MySQL查询转换为JPQL,mysql,jpql,Mysql,Jpql,我不确定这个MySQL查询在JPQL中会是什么样子。 详情: 编辑: 表后外观: mysql> desc post; +---------------+----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------------+----
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> 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
我不使用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
非工作方法的主要问题是从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;
//...
}
JPA 2.0规范要求更复杂的查询,因为ORDER BY子句中可以使用的内容非常有限:
一种状态字段路径表达式,其计算结果为指定的实体或可嵌入类抽象模式类型的可排序状态字段
在SELECT子句中,使用下列选项之一:•a
一般识别变量•a
单值对象路径表达式
一个state_field_path_表达式,其计算结果与
SELECT子句中的状态\字段\路径\表达式
一个result_变量,它引用SELECT子句中已指定相同result_变量的可订购项。今年五月
是聚合表达式、标量表达式或
SELECT子句中的状态\字段\路径\表达式。
下面的查询也可以用于其他实现。当然,额外的变量是结果的一部分,这有点乏味:
SELECT p, SIZE(p.comments) as ord
FROM Post p
ORDER BY ord DESC
我已经使用本机SQL来获得我需要的结果。所以,这并不是对我问题的真正回答,但我将发布我所做的,以及如何使用纯SQL。
因为它不是用JPQL实现的,在实体类中没有命名查询,但是在DAO对象的方法中使用了本机查询
因此,这是方法内容:
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;
}
我正在尝试按评论数排序帖子。大多数评论文章都是先发的。我不使用JPQL,但从文档中看,它很像普通的SQL。我在docs.oracle.com的任何示例中都没有看到像getPost这样的方法调用。你不能正常访问列吗?@Barmar嗯,这些表是用JPA映射到mysql数据库的。因此,getXXX是相应类中的getter方法。这实际上是NamedQuery注释的查询参数中的内容。我猜想您所要做的就是将查询重写为普通联接,而不是在ORDERBY子句中使用相关子查询。我会在回答中给出我的建议。嗯,尝试了简单的SQL方法,不起作用,得到异常:org.apache.openjpa.persistence.ArgumentException:在字符20处遇到计数*。。。。。我对JPQLHmm也是新的,也许它不允许计数*,试试update@Bramar现在,获取异常org.apache.openjpa.persistence.ArgumentException:在字符54处遇到左连接注释c…不知道为什么,我在@Bramar cite的文档中看到了关于JPQL的一章中的LEFT JOIN:JPQL提供了调用本机SQL查询的能力。所以,我想,本机sql应该可以工作,但我不知道为什么它不工作。是的,这种方式的结果不是干净的Post对象列表,这是我真正需要的。无论如何,我还没有找到用JPQL表达这个查询的方法,所以我使用了原生SQL。这是代码摘录,创建查询q=em.CreateNativeQuerySelectfromPostOrder,方法是从comment where comment中选择countpost\u id。post\u id=post.post\u id desc,post.class;一个多星期后,我再次面临同样的问题。我意识到我不能使用本机查询,因为它只返回实体Postpost表列的属性。即使结果是按帖子评论数排序的,我在结果中也看不到这个数字。同时,我了解到,应该使用JPA Criteria API创建此类查询。您可能熟悉JPA标准API吗?通过SIZEp.comments DESC从Post p ORDER中选择p的常见JPA条件查询应该如何?目前我没有意识到我已经面临这个问题,我在这里问了另一个问题:。您可以在那里看到实体类代码,尽管它与您在回答中假设的代码类似。