hql和sql使用记录

hql:

String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " +
                "from CurriculumTag ct where ct.id in (select min (ct.id) from CurriculumTag group by ct.curriculum.alias)";

该hql的语句的作用说起来比较饶,组织了好几次都感觉说不清楚,就这样吧。。。

修正:后来我试了一下上面的hql语句,查询结果不是我想要的。后来改为下面的hql语句才正确。其实下面这条hql就给嵌套查询的类加了一个别名

String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " +
                "from CurriculumTag ct where ct.id in (select min (ct.id) from CurriculumTag ct group by ct.curriculum.alias)";

2014-04-16修改:

  String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " +
                "from CurriculumTag ct where ct.id in (select min(ct2.id) from CurriculumTag ct2 group by ct2.curriculum.alias)";

今天突然发现修改后的hql还是没得到我要的数据,又把嵌套查询的类的别名改为ct2,才正确工作了。原因是父查询的类的别名和子查询的类的别名不能一样,一个ct,一个ct2。。


注:distinct作用于一列和最用于多列的不同效果

表结构:

CREATE TABLE `tb_curriculum_tag` (
  `id` bigint(20) NOT NULL auto_increment,
  `curriculum_alias` varchar(255) NOT NULL,
  `tag_alias` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

表数据:

id curriculum_alias tag_alias
1 5F9FAGvQi6BJJBd 665477
2 5F9FAGvQi6BJJBd 294005
3 5F9FAGvQi6BJJBd 828230
4 5F9FAGvQi6BJJBd 356791

查询一:distinct作用于一列

mysql> select distinct curriculum_alias from tb_curriculum_tag
    -> ;
+------------------+
| curriculum_alias |
+------------------+
| 5F9FAGvQi6BJJBd  |
+------------------+
1 row in set

查询二:distinct作用于多列

mysql> select distinct curriculum_alias,tag_alias from tb_curriculum_tag;
+------------------+-----------+
| curriculum_alias | tag_alias |
+------------------+-----------+
| 5F9FAGvQi6BJJBd  |    665477 |
| 5F9FAGvQi6BJJBd  |    294005 |
| 5F9FAGvQi6BJJBd  |    828230 |
| 5F9FAGvQi6BJJBd  |    356791 |
+------------------+-----------+
4 rows in set

这就是不同的效果,查询二是把两个字段作为整体distinct,我的理解。。

查询三:count和distinct结合使用统计不重复列的个数

mysql> select count(distinct curriculum_alias) from tb_curriculum_tag;
+----------------------------------+
| count(distinct curriculum_alias) |
+----------------------------------+
|                                1 |
+----------------------------------+
1 row in set

查询四:使用group by统计不重复列的个数

mysql> select count(*) from tb_curriculum_tag ct where ct.id in (select min(ct.id)from tb_curriculum_tag ct group by ct.curriculum_alias);
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set

查询四使用group by也实现了查询三的效果。

查询五:使用group by的效果

mysql> select * from tb_curriculum_tag group by curriculum_alias
    -> ;
+----+------------------+-----------+
| id | curriculum_alias | tag_alias |
+----+------------------+-----------+
|  1 | 5F9FAGvQi6BJJBd  |    665477 |
+----+------------------+-----------+
1 row in set

这里加上group by就查询出一条数据,和我原来想的不一样。group by主要结合一些统计函数来进行统计操作。

查询五:count和group by统计

mysql> select count(*) from tb_curriculum_tag ct where ct.id in (select ct.id from tb_curriculum_tag ct group by ct.curriculum_alias);
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set


CurriculumTag类设计:

@Entity
@Table(name = "tb_curriculum_tag")
public class CurriculumTag implements Serializable {

    private Long id;
    private Curriculum curriculum;
    private Tag tag;

    ////////////////setter and getter////////////////////
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /**
     * The name of the column referenced by this foreign
     * key column.
     *
     * @return
     */
    @ManyToOne(targetEntity = Curriculum.class)
    @JoinColumn(name = "curriculum_alias", nullable = false, referencedColumnName = "alias")
    public Curriculum getCurriculum() {
        return curriculum;
    }

    public void setCurriculum(Curriculum curriculum) {
        this.curriculum = curriculum;
    }

    @ManyToOne(targetEntity = Tag.class)
    @JoinColumn(name = "tag_alias", nullable = false,referencedColumnName = "alias")
    public Tag getTag() {
        return tag;
    }

    public void setTag(Tag tag) {
        this.tag = tag;
    }
}







你可能感兴趣的:(hql和sql使用记录)