【问题标题】:Java EE and Entity : best way to get results from a DBJava EE 和实体:从数据库中获取结果的最佳方式
【发布时间】:2015-05-06 07:06:03
【问题描述】:

我目前正在学习 Java EE 以及如何使用 JPA。

我制作了一个很棒的数据库,其中一张表有 20 多个字段。

我想知道从数据库中获取结果的最佳方法是什么。

目前,我使用的是 @NamedQuery,它需要 12 或 13 个参数。

我想知道是否可以改用findAll() 方法,然后执行一个循环,使用.contains()(当然是字符串)验证记录是否是我正在寻找的。

从我的角度来看,使用第二种方法看起来不那么复杂,可能是因为我使用 Java 比使用 JPA 更好(目前)

任何建议都将不胜感激,非常感谢您

【问题讨论】:

    标签: jakarta-ee jpa entity entitymanager named-query


    【解决方案1】:

    如果您使用 findAll 方法(来自 Spring Data JPA - 感谢 Neil Stockton)获得结果,您将记住大量数据。通常最好只获取您需要的记录并仅使用 Java 来“处理”它们,而不是从 DB 中过滤它们。

    【讨论】:

    • 但是如果我只是使用这些数据循环呢?我也可以使用 NamedQuery 作为第一个过滤器,例如过滤用户
    • 您的意思是“Spring Data JPA”的方法 findAll()。 JPA API 没有这样的
    • @trichetriche 问题是,您需要所有数据吗?我的意思是,您是想对表中的所有记录做点什么,还是只对其中一些记录做点什么?
    • 我加载了所有数据,因为我使用 Javascript 数组对输入进行即时研究(使用预输入)。然后我将这些数组存储在会话属性中。但是一旦我这样做了,我就不再使用所有数据了,对于每项研究,我都会使用我的 NamedQuery
    【解决方案2】:

    首先,第二种解决方案将导致向服务器发送比您真正需要的更多的数据。随着表格的增长,就时间性能而言,这可能是一个问题。此外,根据我的经验,由于where 约束而导致数据较少的查询将在数据库中更快地执行。最后,我不会忽略一个事实,数据库的主要特性是查询优化,它旨在优化查询执行,我认为最好使用它而不是用 Java 处理结果数据。

    【讨论】:

    • 但考虑到无论如何我都必须加载所有数据,使用 Java 代替 JPA 会更容易/更快吗?我可以对 1 或 2 个标准进行第一次过滤,以减少获取的记录数量
    【解决方案3】:

    如果您想根据搜索条件在表中搜索数据,您可以使用不同的方法,在 JPA 中您可以像这样检索数据块:

    boolean existOnSessionArray=findInSessionArray(searchCriteria);
    int numMaxResultsPerBlock=50;
    int pageNumber=0;
    int firstResult=0;
    while( !sexistOnSessionArray){
        Query query=entityManager.createNamedQuery("yourQueryName");
        query.setMaxResults(numMaxResultsPerBlock);//you will retrieve only 50 records per block
        query.setFirstResult(firstResult);//your first record to the 49 record
        List fetchedData=query.getResultList();
        //Check if the new fetched list contains your expected result
        boolean existInNewFetchedData=check(fetchedData,searchCriteria);
        updateSessionArrayWithNewFetchedData(fetchedData);
        if(!existInNewFetchedData){
            pageNumber++;
            firstResult=pageNumber*numMaxResultsPerBlock;
        }else{
            break;
        }
    }
    

    在此示例中,您将根据搜索条件(输入文本字段的值)搜索 50 条记录的块找到您的数据,如果前 50 条记录中不存在您的搜索条件,则此记录将存储在您的会话中数组,然后您将搜索您的搜索条件是否存在于接下来的 50 条记录 (51-100) 中,依此类推,直到找到您的数据。这样您就不必修改查询名称。我看到的唯一问题是,如果您在应用程序运行时将所有数据存储在会话数组中,如果有人从该表中更新(插入或删除)数据会发生什么?您还需要更新会话数组。

    希望对你有帮助...

    【讨论】:

      【解决方案4】:

      “最佳”是相对的。

      不过,执行CRUD 操作的一种优雅方式是使用 Spring 框架的强大功能。你可以从here 学习如何做到这一点,前提是你有一些基本的 Spring 知识,比如创建 bean 以及框架如何在基本(在最后一个链接的前面章节中很容易获得)和普通 MySQL 和 JDBC 中工作知识。

      Spring 负责创建连接、准备和执​​行 SQL 等低级任务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多