SQL连接与Java代码?

时间:2014-09-01 10:39:46

标签: java sql hibernate jooq

我有这样的查询

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开头的表都是缓存表,因此这些表已包含数据。

假设某人使用 JOOQ Hibernate 哪一个将是最佳选择

  1. 使用上面写的查询和所有联接?
  2. 或者使用Java代码来满足要求而不是加入,因为当用户使用HibernateJOOQ时,它已经拥有表的Java类,而Valid表已经拥有了所有数据?

3 个答案:

答案 0 :(得分:4)

好的,你可能不会喜欢这个答案,但最好的办法就是不要让Valid"缓存"。

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

jOOQ和Hibernate的人几乎肯定比你更擅长SQL。我们在非常大的企业项目中使用了jOOQ和Hibernate,并且它们都表现出色。特别是像BoneCP这样的良好连接池。如果在您运行设置并运行良好但仍然认为可能存在性能问题后,您可以随后添加缓存(如EhCache)。

最终,我对您的软件做了很多假设,即

  1. 比你更多的人工作,
  2. 必须保持。如果这些假设都不成立,那么你可以放心地忽略这个答案。

答案 1 :(得分:2)

一般答案:

现代数据库非常擅长优化查询并为您选择最佳执行计划。鉴于使用*=的外部联接表示法,您显然使用的是SQL Server,因此这是一个非常好的数据库。

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

实际上,根据数据的性质,数据库甚至可能会评估您的某些联接是不必要的(if you have the right meta data, like constraints)。

具体答案:

在您的特定情况下,看起来就好像您确实可以自己删除大部分查询并使用应用程序的Folder表>"有效" 缓存。我说看起来像,因为我不完全理解这些联接背后的业务逻辑,以及他们是否都建立了1:1关系,或者是否删除它们将改变查询的语义。

因此,从技术上讲,您可以删除联接,但如果您想保持安全,那么只需保持原样,就像迁移到jOOQ或Hibernate一样。

备选方案3:

当然,在您加载"有效&#34时,您甚至可以删除此查询并获取先前查询中已有的Folder.name属性,而不是篡改此查询。 ; 内容到内存中。

答案 2 :(得分:1)

有没有听说过意见?看看他们,你会感到惊讶 除此之外,不可能说你应该做什么,没有最好的"并且您提供的信息太少,甚至无法对您的具体要求做出有根据的猜测
但是,我不会在最终在任何程序中的查询中对数据库ID之类的内容进行硬编码,这很容易在(近)未来出现问题。