SQL连接vs Java代码?

SQL连接vs Java代码?,java,sql,hibernate,jooq,Java,Sql,Hibernate,Jooq,我有一个这样的问题 Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser, ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode and ValidUser.DepartmentCode *= ValidDepartment.Depar

我有一个这样的问题

Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser,
ValidLocation, ValidDepartment where  ValidUser.LocationCode *= ValidLocation.LocationCode         
    and ValidUser.DepartmentCode *= ValidDepartment.DepartmentCode and Folder.IssueUser =         
    ValidUser.UserId and ValidFolder.FolderType = Folder.FolderType and         
    ValidFolderGroup.FolderGroupCode = ValidFolder.FolderGroupCode and         
    ValidFolderGroup.GroupTypeCode = 13 and (ValidUser.UserId='User' OR             
    ValidUser.ManagerId='User')  and ValidFolderGroup.GroupTypeCode = 13 and             
    Folder.IssueUser = 'User' 
现在这里所有以
Valid
开头的表都是缓存表,所以这些表已经包含了数据

假设有人使用JOOQHibernate哪一个是最好的选择

  • 对所有联接使用如上所述的查询
  • 或者使用Java代码来满足需求,而不是加入,因为作为使用
    Hibernate
    JOOQ
    的用户,它已经有了表的Java类,
    Valid
    表已经有了所有数据
    听说过观点吗?看看它们,你会惊讶的。
    除此之外,你不可能说出你应该做什么,也没有“最好的”,你提供的信息太少,甚至无法对你的具体需求做出有根据的猜测。


    但是,我不会在查询中硬编码数据库ID之类的东西,这些东西最终会出现在任何程序中,太容易在(不远的)将来引起问题。

    好的,您可能不会喜欢这个答案,但最好的方法是不要将
    有效的
    缓存起来

    在我看来,最好的解决方案是使用
    jOOQ
    (如果您更喜欢DSL)或Hibernate(如果您更喜欢或映射)并每次查询数据库,并且始终使用DAO模式

    jOOQ
    和Hibernate的家伙几乎肯定比你更擅长SQL。我们在大型企业项目中使用了jOOQ和Hibernate,它们的性能都非常出色。尤其是使用良好的连接池,如
    BoneCP
    。如果在安装程序运行且运行良好后,仍然认为可能存在性能问题,则始终可以在之后添加缓存(如
    EhCache

    最后,我对你的软件做了很多假设,也就是

  • 有比你更多的人在工作,而且
  • 它必须得到维护。如果这两个假设都不成立,那么你可以放心地忽略这个答案
  • 一般答覆: 现代数据库在优化查询和为您选择最佳执行计划方面非常出色。考虑到使用
    *=
    的外部连接表示法,显然您使用的是SQL Server,所以这是一个非常好的数据库

    即使您的应用程序内存中已经有很多“有效”数据,也有可能您的数据库在缓冲区缓存中已经有相同的数据,因此数据库不需要为查询中的各种连接再次访问磁盘

    事实上,根据数据的性质,数据库甚至可能会评估不需要某些联接()

    具体答复: 在您的特定情况下,看起来您确实可以自己剥离大部分查询,并使用应用程序“有效”缓存中的搜索条件仅查询
    文件夹
    表。我是说它看起来是这样的,因为我不完全理解这些连接背后的业务逻辑,也不完全理解它们是否都在建模1:1关系,或者删除它们是否会改变查询的语义

    因此,从技术上讲,您可以删除连接,但是如果您想保持安全,只需在迁移到jOOQ或Hibernate时保持原样即可

    备选案文3:
    当然,当您将“有效”内容加载到内存中时,您甚至可以删除此查询并获取以前查询中已有的
    Folder.name
    属性,而不是篡改此查询。

    您的问题并不完全清楚。“使用Java”是什么意思?我的意思是说,关于Java代码,因为有效表已经缓存了数据,所以这些表的Java类的实例已经包含了该表的所有数据,所以将有效表添加到where条件中,我可以首先从文件夹表中获取所有记录,然后在Java for循环中,我可以满足条件并创建一个列表。您在使用什么作为缓存机制?如果您只是将整个
    有效的
    表加载到内存中,我几乎可以向您保证这是一个糟糕的解决方案。对于任何问题。有效的表只有很少的记录,比如只有10-20条记录。你怎么知道?你们有什么机制来执行这一点?hanks,但我不能删除有效的表概念作为应用程序的基础,将来我们可以删除,但不是现在,我没有说删除它。我说“不要将数据存储在内存中,需要时从数据库中获取”,或者,如果数据是静态和不可变的,不要将其存储在数据库中。