orm查询部分字段_ORM问题第2部分–查询

orm查询部分字段

在我以前关于对象关系映射工具(ORM)的帖子中,我讨论了在处理当今常见的ORM(包括Hibernate)时遇到的各种问题。 其中包括与从POJO生成架构有关的问题,实际性能和不断出现的维护问题。 本质上,结论是ORM可以为您提供大部分帮助,但是需要一种平衡的方法,有时您只是想避免使用ORM的工具集,因此您应该能够在需要时绕过它。

我看到的现代ORM的一个巨大缺陷是,它们确实希望帮助您解决所有SQL问题。 我这是什么意思,为什么我要说这是一个错误? 好吧,我相信Hibernate等人只是太努力了 ,最终提供的功能实际上给开发人员带来的伤害超过了他们的帮助。 我所说的主要思想是查询支持。 ORM中严重缺乏对易于维护的复杂查询的实际支持,并不是因为它们省略了一些东西-仅仅是因为它们提供的工具没有使用SQL,SQL正是为此目的而专门设计的。

Hibernate的经验

我的经验是,当您使用HQL之类的功能时,经常会考虑将自己节省几分钟,这本身并没有什么问题,但这会引起严重的问题。 根据我的经验,由于错误修复或增强功能,您最终常常想要或需要用更灵活的方式替换HQL,而这正是麻烦的开始。

我认为自己是一位经验丰富的开发人员,并且我为自己(通常)不打破事物而感到自豪-对我而言,这是优秀开发人员的标志之一。 当您面临着剥离一段代码并大范围地替换它(例如用SQL替换HQL)时,您基本上是在替换具有悠久历史的代码,这些历史记录包括错误修复,增强功能和性能调整。 现在,您有责任复制对此代码的所有更改,并且很可能您不了解更改的全部范围或过去已纠正的小问题。

请注意,这也适用于Hibernate提供的所有其他查询方法,包括Query API,以及扩展到JPA中的查询支持。 问题是您不希望解决方案过于脆弱或受限,因此以后必须完全替换。 这意味着,如果您需要恢复为SQL以完成任务,则很有可能首先应该这样做。 相同的概念适用于软件开发的所有领域。
因此,如果像Hibernate这样的ORM中的基本查询支持不够好,我们的目标是什么?

坚实的ORM的标准

基本上,我对ORM的个人要求可以归结为以下几点:

  • 架构优先–从数据库生成模型,而不是相反。 如果您有与平台无关的为数据库指定DDL的方式,那很好,但这不是一个大问题。 从其他某些特定于域的语言或格式生成数据库不会帮助任何人,并且会导致设计不良的架构。
  • 仅限于SQL –如果您想帮助我避免编写代码,然后为我生成/公开基于密钥的查询等。 不要要求我使用您的查询API或某些新的查询语言。 SQL是为查询而发明的,所以让我使用正确的工具。
  • 给我简单的方法来从查询中填充域对象。 这给了我99%的需求,同时又给了我灵活性。
  • 请允许我用查询结果填充任意Java Bean –不要将我绑定到已知类型的注册表中。
  • 不要强迫我使用像Hibernate或Spring提供的那样的典型事务容器–它们是一场灾难,而且我从未见过对它们有意义的实际用途。 让我来处理在我的应用程序中获取和释放连接/事务的位置–通常,这仅发生在少数几个具有清晰语义的地方。 这可以是JDBC的某些抽象版本,但让我控制它。
  • 我的域对象中没有聪明/神奇的行为–使用Hibernate时,我花了很多时间解决相同的旧代理和延迟加载问题。 它们永无止境,无法一劳永逸地解决,这表明存在严重的设计问题。

尽管这些观点对我来说似乎是完全合理的,但我还没有遇到任何真正能够满足我期望的ORM,因此在Carfey,我们推出了自己的小ORM,我不得不说,周末的项目以及我们所拥有的只是总体发展比Hibernate或我使用的其他ORM更加容易和快捷。 它提供什么?

一个简单的功利主义ORM

  • Java域类是从数据库模式生成的。 尚无平台无关的DDL,但它在我们的TODO列表中。 Bean包括对子集合,FK引用的支持,但是它们都是惰性的和可选的– Bean支持它,但是,如果您不使用它们,则不会产生影响。 如果需要,可以直接使用ID,也可以使用域对象本身。 持久性仅处理持久性脏对象,并且仅在请求时才进行保存-没有魔术冲洗行为。
  • 生成的域类仅用于持久性! 将您的业务逻辑等置于其他位置。
  • SQL用于所有查找,包括主键提取和外键关系。 如果您需要增强查找,只需窃取生成SQL并在其上进行构建即可。 方法和SQL是从任何索引列中自动生成的,因此会自动为您提供它们并且类型安全。 这也向开发人员发出警告–如果您的域类中没有可用的查找,则由于索引不存在,查找性能可能会变差。
  • 可以以类型安全的方式从自定义查询中填充任何域类-灵活但易于使用。
  • 改进的类可隐藏标准的JDBC类型(例如ConnnectionStatement ,以便于使用,但我们不会对您施加任何事务语义,并且您始终可以退回到直接结果集处理之类的方法。
  • 一些基本的必需功能,例如连接池,数据库元数据以及很快的数据库从属故障转移。

Carfey的我们不相信我们已经创建了一些令人难以置信的新ORM,超越了所有其他工作,如果这是一个公共项目,我们必须添加许多功能,但是我们所拥有的功能对我们有用,并且我认为我们有正确的方法。 至少,希望我们的经验可以帮助您明智地选择使用首选的ORM,而不用花费太多时间来提供工具而不是交付软件。

最后要说明的是,如果您有满足我上面要求列表的ORM的经验,并且您有很好的经验,那么我很乐意听到有关它的信息,并考虑将其用于将来的Carfey项目。

参考: ORM的问题第2部分–来自我们JCG合作伙伴的 查询   Carfey软件博客上的 Craig Flichel。


翻译自: https://www.javacodegeeks.com/2012/02/problems-with-orms-part-2-queries.html

orm查询部分字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新浪微博开发-添加子视图控制器设置颜色

一.添加子视图控制器 二.设置颜色 设置颜色:两种方法 一种较为繁琐,详见视频 第二种: //设置颜色 self.tabBar.tintColor UIColor.orangeColor()转载于:https://www.cnblogs.com/torrescx/p/5237142.html

linux ssh无需密码,linux下 ssh 实现无需密码的远程登陆

主机A(OpenSUSE12.1):119.78.222.95主机B (Fedora16): 202.122.25.361.主机A:生成秘钥对id_rsa和id_rsa.publinux-9juc:~ # ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):Created directory /root/.ssh.…

Android studio的sdk tools下没有LLDB的解决办法

粉丝提问: 博主解答: 解决办法: 点击setting--》plugins--》找到“Android Support”选项,并勾选,然后会提示重启android studio ,点击重启,ok,如果已经设置好SDK的路径的话,问题解…

随机JCache内容:多个提供程序和JMX Bean

JCache(JSR 107)是用于缓存的Java标准…足够了。 没有更多介绍性的东西。 这是一则速成文章,内容涉及 多个JCache提供程序配置,以及 功能:通过JMX Mbeans的JCache统计信息 管理多个JCache提供程序 如果您只使用一个…

HDU 2222 ac自动机模板

题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是有些出入......不虚慢慢看... 然后就是特殊一点的一个last数组,可以比较迅速地找到包含的子串…

linux下spi添加设备,Linux Kernl添加spidev的设备节点

一、spidev介绍如果在内核中配置spidev,会在/dev目录下产生设备节点,通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。二、配置spidev设备步骤在i.MX6,Kernel 4.1.15上配置spidev的支持。1、配置dts支持spi…

Android studio Jin开发生成so文件的具体步骤

粉丝提问: 博主解答: 帖子链接:https://blog.csdn.net/wangsfine/article/details/51445199

linux中改变文件大小,Linux 改变文件大小的方法

函数原型:#include int ftruncate(int fd, off_t length); //改变文件大小为length指定大小;返回值 执行成功则返回0,失败返回-1。函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以…

Ubuntu下使用SVN

Ubuntu下使用SVN SVN作为日常开发中不可缺少的工具,今天终于开始在Ubuntu下使用了。 1、首先需要安装SVN。Ubuntu下的SVN安装十分简单,sudo apt-get install subversion,然后根据提示一步一步,就完成了SVN的安装; 2、检…

apktool重新打包,error:No resource identifier found for attribute ‘compileSdkVersionCodename‘ in package

报错日志:AndroidManifes.xml :1 error:No resource identifier found for attribute compileSdkVersionCodename in package ‘android’ 粉丝提问: 报错图: 博主解答:

linux弹性网卡,将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡

本文在介绍将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡的基础上,重点探讨了其具体步骤,本文内容很紧凑,希望大家耐心学习。配置 ECS 实例的弹性网卡如果您的实例使用以下几种镜像,您不需要手工配置弹性网卡(ENI)&#xff1a…

vaadin_嵌入式码头,Vaadin和焊接

vaadin当我开发Web应用程序时,我希望能够从Eclipse快速启动它们,而不必依赖各种重量级的tomcat或glassfish插件。 因此,我经常要做的就是创建一个可以直接从Eclipse直接运行的基于Java的简单Jetty启动器。 该启动器会在几秒钟内启动&#xff…

终端-进入云服务器

解决办法: 1.先进入管理员模式: 2.下一步,链接服务器。 3.已经连接上服务器: 4.找到云服务器的项目路径: 在这里: 我们可以在cd空格/ 按Tab寻找下个文件夹,也可以输入ls查看文件夹。转载于…

Android studio 清除缓存数据的步骤

导读:在eclipse的当中进行运行Android的运用的程序的时候,就会产生内存缓存的信息,而eclipse是可以直接点击停止运行程序,然后点击清除缓存,就可以解决了这个问题,而Android studio却不能直接点击停止运行的,而只能通过其它的方式来清除Android studio中的缓存。 可以看…

linux 函数 文件校验,Linux中的文件效验命令

在网络传输、设备之间转存、复制大文件等时,可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的。md5sum命令用于生成和校验文件的md5值,MD5全称报文摘…

为Java应用程序编写数据驱动的测试

JUnit是一个功能非常强大的测试框架,它不仅为其用户提供了编写快速简便的测试的功能,而且还为用户提供了扩展它并使其按其期望的方式工作的机会。 在JUnit之上构建了许多框架,这些框架为目标受众提供了各种易用的功能。 EasyTest是这样一种框…

为《31天成为IT服务达人》征求正式名字

写书时。没细想书的名字,仅仅是在想出本能够让同行或未来同行高速入门的书,如今想来还是应正式给他取个名,请朋友们帮忙哟 转载于:https://www.cnblogs.com/bhlsheji/p/5241848.html

设置按钮5秒后可以点击下一步||5秒后自动关闭网页

场景:业务需要在点击拍摄的时候提示一个用户须知页面,5秒后可以点击下一步。这属于一个js计时器的功能。这里用jQuery实现一下 效果图: html <div style="text-align: center;"><input type="button" value="下一步" id="next…

Codeforces Round #344 (Div. 2) B. Print Check

题意&#xff1a; 给你一个n*m一开始全是0的矩阵&#xff0c;然后又q次询问 每次询问给你三个字母 op,a,b 将第a行变成b 将第a列变成b 然后让你输出Q次询问后&#xff0c;这个矩阵长什么模样 思路&#xff1a;每个格子记录两个状态&#xff0c;区分横竖。 1 #include<cstdio…

linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记

关于 SKB序列号的小笔记为了修改TCP协议&#xff0c;现在遇到了要改动tcp分组的序列号&#xff0c;但是只是在tcp_sendmsg函数中找到了SKB的end_seq 一直没有找到seq不清楚在那里初始化了&#xff0c;就跟踪了分配SKB的函数 sk_stream_alloc_skb()还是没有找到&#xff0c;最…