技术开发 频道

Hibernate vs. Rails:数据持久化


查询语言

    Hibernate和Rails在查询语言、查询能力和用法上有许多相似的地方。从本质上说,Rails使用SQL进行查询,这是从数据库中输入、输出数据的标准方法。另外,通过动态finder方法的使用,可以使开发人员利用这些方法写一些简单的查询,我认为,这相当于为Rails增加了一种“mini”语言。

    另一方面,Hibernate有它自己的面象对象查询语言(Hibernate Query Language – HQL),这种查询语言和SQL非常类似。但和SQL不同的是,HQL可以让开发人员根据对象和属性,而不是表和列来表达他(她)们的查询。Hibernate将HQL翻译成优化的相应数据库的SQL,显然,发明一种新的查询语言非常重要的。HQL丰富的表现力和强大的功能是Hibernate的卖点之一。现在,让我们看一些关于这方面的例子。

Rails Finders 方法

   Rails的finder方法使用是非常简单的。Rails可以为对象动态加入finder方法,然后再将其加翻译成SQL。如在下面的例子中,我们想查miners的first_name和last_name。

    @miners = Miner.find_by_first_name_and_last_name("Elma", "Garrott")

    除此之外,活动记录还提供了finder方法让你输入SQL语句。

# Returns only the first record @miner = Miner.find_first("first_name = ?", "Elma") # Finds up to 10 miners older than 30, ordered by age. @miners = Miner.find_all ["age > ?", 30], "age ASC", 10 # Like find all, but need complete SQL @minersWithSqA = Miner.find_by_sql [ "SELECT m.*, g.square_area FROM gold_claims g, miners m " + " WHERE g.square_area = ? and m.gold_claim_id = g.id", 1000]
   用HQL查询对象

    上述可知,HQL可以表示成对象和列。而对于简单的查询,Rails更容易定义。当你必须使用对象来查询时,HQL是非常方便的。下面让我们来看一个例子。
// Find first Miner by name Query q = session.createQuery("from Miner m where m.firstName = :name"); q.setParameter("name", "Elma"); Miner m = (Miner) q.setMaxResults(1).uniqueResult(); // Finds up to 10 miners older than 30, ordered by age. Integer age = new Integer(30); Query q = session.createQuery( "from Miner m where m.age > :age order by age asc"); List miners = q.setParameter("age", age).setMaxResults(10).list(); // Similar to join query above, but no need to manually join Query q = session.createQuery( "from Miner m where m.goldClaim.squareArea = :area"); List minersWithSqA = q.setParameter("area", new Integer(1000)).list();
结论

    本文并未覆盖持久化的所有内容,我们到现在为止已经发现了一些这两个框架的不同之处。希望读者能对它们的“机会成本”有更好的认识。本文已经覆盖了Rails和Hibernate的基本体系结构模式,还有如何应用这两个框架中其本的持久化类。对于关系来说,ORM是可能拥有更多的映射关系。但本文只覆盖了大多数开发人员使用的基本映射关系。

   Rails和Hibernate在查询语言上是有很大差异的。在它们的查询语言上做一个全面的比较是不可能的,一般地,Rails从单独的表或对象上查询数据是非常快的,而Hibernate更适合处理关系复杂的查询。Rails使用大多数开发者都熟悉的SQL,而Hibernate提供了一种新的面向对象的查询语言:HQL。
0
相关文章