精华内容
下载资源
问答
  • 当我使用条件查询获取list属性时,我正在观察我认为JPA 2中的意外行为.我的查询如下(它的摘录):CriteriaBuilder b = em.getCriteriaBuilder();CriteriaQuery c = b.createQuery(MainObject.class);Root root = c....

    当我使用条件查询获取list属性时,我正在观察我认为JPA 2中的意外行为.

    我的查询如下(它的摘录):

    CriteriaBuilder b = em.getCriteriaBuilder();

    CriteriaQuery c = b.createQuery(MainObject.class);

    Root root = c.from(MainObject.class);

    Join firstFetch = (Join) root.fetch(MainObject_.firstFetch);

    firstFetch.fetch(FirstFetch_.secondFetch); //secondFetch is a list

    c.select(root).distinct(true);

    (所以,假设我将列表作为对象属性的属性.)

    问题是当查询返回多个结果时,secondFetch值会在返回行时重复多次.每个firstFetch应该只有一个secondFetch但是有n代替.

    我在这种情况下看到的唯一特殊性是所有MainObjects恰好具有相同的FirstFetch实例.

    所以我的猜测是正在交叉连接,这是正常的,但是JPA无法将其secondFetch对象分配给firstFetch中的每一个.

    映射不应该太特别,或多或少都是这样的

    @Entity

    @Table(name="mainobject")

    public class MainObject{

    //...

    private FirstFetch firstFetch;

    @ManyToOne(fetch=FetchType.LAZY)

    @JoinColumn(name="mainObject_column")

    public FirstFetch getFirstFetch() {

    return firstFetch;

    }

    }

    @Entity

    @Table(name="firstFetch")

    public class FirstFetch{

    //...

    private List secondFetch;

    @OneToMany(mappedBy="secondFetch")

    public List getSecondFetch() {

    return secondFetch;

    }

    }

    &安培;最后

    @Entity

    @Table(name="secondFetch")

    public class SecondFetch {

    //....

    private FirstFetch firstFetch; //bidirectional

    @ManyToOne

    @JoinColumn(name="column")

    public FirstFetch getFirstFetch() {

    return firstFetch;

    }

    }

    我一直在寻找适用于fetch的某种不同的句子但是没有(无论如何都会是’补丁’……)

    如果我改变了

    List

    对于

    Set

    由于Sets’Key,我会得到预期的结果,所以我觉得这在JPA的列表中是一种不当行为.

    不过,我不是专家,所以我可以完美地在映射或查询中犯一些错误.

    任何反馈都非常欢迎帮助清除这一点.

    谢谢.

    展开全文
  • 一:数据库查询出结果 二:想要的结果为  同是乒乓球的话,则乒乓球和乒乓球2同在乒乓球下,即乒乓球下有两个实体 三:java代码  public void get() { String sql = "SELECT a.id,a.info,s.id as sid,s....

    一:数据库查询出结果


    二:想要的结果为

      同是乒乓球的话,则乒乓球和乒乓球2同在乒乓球下,即乒乓球下有两个实体

    三:java代码

      public void get() {
    String sql = "SELECT a.id,a.info,s.id as sid,s.sport_name,c.type,c.num from gym_areas a LEFT JOIN sport_items s on a.sport_item_id=s.id”

                                         +“  LEFT JOIN coupon c ON a.id=c.gym_area_id and c.type=6 WHERE a.gym_id=16";
    List<Record> list = Db.find(sql);
    Map<String, List<Record>> r1 = new HashMap<>();
    for (int i = 0; i < list.size(); i++) {
    List<Record> r2 = new ArrayList<>();
    Record spo = list.get(i);
    Object str = r1.get(spo.getStr("sport_name"));
    String name = spo.getStr("sport_name");
    if (str == null) {
    r2.add(0, list.get(i));
    r1.put(name, r2);
    } else {
    List<Record> r = r1.get(name);
    r.add(r.size(), list.get(i));
    r2.addAll(r);
    r1.put(name, r2);
    }


    }
    renderJson(JsonKit.toJson(r1));
    }

    四:结果示例

    {"游泳":[{"sport_name":"游泳","num":3000,"id":26,"type":6,"info":"游泳馆2","sid":3}],
    "羽毛球":[{"sport_name":"羽毛球","num":null,"id":28,"type":null,"info":"羽毛球","sid":1}],
    "篮球":[{"sport_name":"篮球","num":6000,"id":29,"type":6,"info":"篮球","sid":4}],
    "网球":[{"sport_name":"网球","num":null,"id":31,"type":null,"info":"室外网球","sid":2}],
    "乒乓球":[{"sport_name":"乒乓球","num":null,"id":30,"type":null,"info":"乒乓球","sid":5},{"sport_name":"乒乓球","num":null,"id":34,"type":null,"info":"乒乓球2","sid":5}]}

    展开全文
  • GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master在MySQL进行数据插入操作时,总是会考虑是否会插入重复数据,之前的操作都是先根据主键或者唯一约束条件进行查询,有就进行更新没有就...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!

    GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

    在MySQL进行数据插入操作时,总是会考虑是否会插入重复数据,之前的操作都是先根据主键或者唯一约束条件进行查询,有就进行更新没有就进行插入。代码反复效率低下。

    新建表格

    CREATE TABLE `person` (

    `id` int NOT NULL COMMENT '主键',

    `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '姓名',

    `age` int NULL DEFAULT NULL COMMENT '年龄',

    `address` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '地址',

    PRIMARY KEY (`id`) USING BTREE

    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

    添加三条数据如下:

    8a5cdef55296

    如何防止MySQL重复插入数据,这篇文章会告诉你

    我们这边可以根据插入方式进行规避:

    1. insert ignore

    insert ignore 会自动忽略数据库已经存在的数据(根据主键或者唯一索引判断),如果没有数据就插入数据,如果有数据就跳过插入这条数据。

    插入SQL如下:

    insert ignore into person (id,name,age,address) values(3,'那谁',23,'甘肃省'),(4,'我的天',25,'浙江省');

    再次查看数据库就会发现仅插入id为4的数据,由于数据库中存在id为3的数据所以被忽略。

    8a5cdef55296

    如何防止MySQL重复插入数据,这篇文章会告诉你

    2. replace into

    replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。

    插入SQL如下:replace into person (id,name,age,address) values(3,'那谁',23,'甘肃省'),(4,'我的天',25,'浙江省');

    首先我们将表中数据恢复,然后进行插入操作后发现id为3的数据发生了改变同时新增了id为4的数据。

    8a5cdef55296

    如何防止MySQL重复插入数据,这篇文章会告诉你

    3. insert on duplicate key update

    insert on duplicate key update 如果在insert into语句的末尾指定了on duplicate key update + 字段更新,则会在出现重复数据(根据主键或者唯一索引判断)的时候按照后面字段更新的描述对该信息进行更新操作。

    插入SQL如下:

    insert into person (id,name,age,address) values(3,'那谁',23,'甘肃省') on duplicate key update name='那谁', age=23, address='甘肃省';

    首先我们将表中数据恢复,然后在进行插入操作时,发现id为3的数据发生了改变,进行了更新操作。

    8a5cdef55296

    如何防止MySQL重复插入数据,这篇文章会告诉你

    我们可以根据自己的业务需求进行方法的选择。

    展开全文
  • 我是用java从本地数据库中(oracle)提取数据后,封装,发送给远程服务器,然后远程服务器会返回发送结果代码。 我在主表中的每条数据都有一个字段显示其发送次数,还有一个字段显示发送结果。再有一张结果表,...
  • Java面试笔试面经、Java技术每天学习一点公众号Java面试关注我不迷路作者:千g来源:https://blog.csdn.net/n950814abc最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询重复的试题,并且删除掉重复...

    Java面试笔试面经、Java技术每天学习一点

    8331f7fc0247d17c95e9a667a145f774.png

    公众号Java面试

    关注我不迷路

    作者:千g

    来源:https://blog.csdn.net/n950814abc

    d34cf7ffbd5025d2f398b6715a4343b8.png

    最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除掉重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。

    首先写了一个小的例子:

    一、单个字段的操作

    这是数据库中的表:

    7f076ee98cc4b771e509a1d2164c9041.png

    分组介绍:

    9d12fe9d06b9d76eaa67f4b4fda841a4.png
    Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1

    查看是否有重复的数据:

    • GROUP BY

    • HAVING

    查询出:根据dname分组,同时满足having字句中组条件表达式(重复次数大于1)的那些组

    count(*)与count(1) 其实没有什么差别,用哪个都可以

    count(*)与count(列名)的区别:

    count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)

    1. 查询全部重复的数据:

    40ca79666893a44bb3d20a2619ac056d.png
    Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)

    2. 删除全部重复试题:

    将上面的查询select改为delete(这样会出错的)

    DELETE
    FROM
     dept
    WHERE
     dname IN (
      SELECT
       dname
      FROM
       dept
      GROUP BY
       dname
      HAVING
       count(1) > 1
     )

    会出现如下错误:[Err] 1093 - You can't specify target table 'dept' for update in FROM clause

    原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

    解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。

    78cf15f436c04c11d40b0c2c40220e9b.png

    3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)

    a. 第一种方法:

    22fe9c69df12c6c00225c27ebc85f7cd.png
    SELECT
     *
    FROM
     dept
    WHERE
     dname IN (
      SELECT
       dname
      FROM
       dept
      GROUP BY
       dname
      HAVING
       COUNT(1) > 1
     )
    AND deptno NOT IN (
     SELECT
      MIN(deptno)
     FROM
      dept
     GROUP BY
      dname
     HAVING
      COUNT(1) > 1
    )

    上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:

    b. 第二种方法:

    ☆根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)

    SELECT *
    FROM
     dept
    WHERE
     deptno NOT IN (
      SELECT
       dt.minno
      FROM
       (
        SELECT
         MIN(deptno) AS minno
        FROM
         dept
        GROUP BY
         dname
       ) dt
     )

    c. 补充第三种方法:

    SELECT
     * 
    FROM
     table_name AS ta 
    WHERE
     ta.唯一键 <> ( SELECT max( tb.唯一键 ) FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 );

    4. 删除表中多余重复试题并且只留1条:

    a. 第一种方法:

    DELETE
    FROM
     dept
    WHERE
     dname IN (
      SELECT
       t.dname
      FROM
       (
        SELECT
         dname
        FROM
         dept
        GROUP BY
         dname
        HAVING
         count(1) > 1
       ) t
     )
    AND deptno NOT IN (
    SELECT
     dt.mindeptno
    FROM
     (
      SELECT
       min(deptno) AS mindeptno
      FROM
       dept
      GROUP BY
       dname
      HAVING
       count(1) > 1
     ) dt
    )

    b. ☆第二种方法(与上面查询的第二种方法对应,只是将select改为delete):

    DELETE
    FROM
     dept
    WHERE
     deptno NOT IN (
      SELECT
       dt.minno
      FROM
       (
        SELECT
         MIN(deptno) AS minno
        FROM
         dept
        GROUP BY
         dname
       ) dt
     )

    c. 补充第三种方法(评论区推荐的一种方法):

    DELETE 
    FROM
     table_name AS ta 
    WHERE
     ta.唯一键 <> (
    SELECT
     t.maxid 
    FROM
     ( SELECT max( tb.唯一键 ) AS maxid FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 ) t 
     );

    二、多个字段的操作:

    单个字段的如果会了,多个字段也非常简单。就是将group by 的字段增加为你想要的即可。

    此处只写一个,其他方法请仿照一个字段的写即可。

    DELETE
    FROM
     dept
    WHERE
     (dname, db_source) IN (
      SELECT
       t.dname,
       t.db_source
      FROM
       (
        SELECT
         dname,
         db_source
        FROM
         dept
        GROUP BY
         dname,
         db_source
        HAVING
         count(1) > 1
       ) t
     )
    AND deptno NOT IN (
     SELECT
      dt.mindeptno
     FROM
      (
       SELECT
        min(deptno) AS mindeptno
       FROM
        dept
       GROUP BY
        dname,
        db_source
       HAVING
        count(1) > 1
      ) dt
    )

    总结:

    其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:

    • 在经常查询的字段上加上索引

    • 将*改为你需要查询出来的字段,不要全部查询出来

    • 小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的

    展开全文
  • list中数据如下[img=https://img-bbs.csdn.net/upload/201503/03/1425372927_137836.png][/img]这是list1的数据。[img=...就是如何取得list1中list2没有的数据,放入一个新的list中
  • 这时候我们有需要做数据初始化的操作,需要把历史数据做删除,来确脚本运行的重复执行,和稳定性质。B: 在做新增操作时候,需要校验数据是否存在后台。需要校验后台数据。实现思路:1.把数据库的连接地址、用户名、...
  • 1:集合2 Collection(单列集合)3 List(有序,可重复)4 ArrayList5 底层数据结构是数组,查询快,增删慢6 线程不安全,效率高7 Vector8 底层数据结构是数组,查询快,增删慢9 ...
  • 1:集合Collection(单列集合)List(有序,可重复)ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList底层数据结构是链表,查询慢,增删快线程...
  • Java中常见数据结构:list与map -底层如何实现 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询
  • 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组
  • 1:集合2 Collection(单列集合)3 List(有序,可重复)4 ArrayList5 底层数据结构是数组,查询快,增删慢6 线程不安全,效率高7 Vector8 底层数据结构是数组,查询快,增删慢9 ...
  • 如何查找重复如何删除重复如何查找多列上的重复行错误的查询语句几种正确的方法《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现...
  • 如何对比两列excel的数据库因为你说的太模糊,找面的案例...是通过建立数据库的方式吗vlookupvba 高手请进-问excel如何同时查询两个数据库表将结果对比不同...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、连接池是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 接上一个文章,因为上一个是直接连接的...
  • 1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 229
精华内容 91
关键字:

java如何查询重复数据

java 订阅