Java JPA和Hibernate搜索的方法是什么?

Java JPA和Hibernate搜索的方法是什么?,java,php,hibernate,jpa,hibernate-search,Java,Php,Hibernate,Jpa,Hibernate Search,我一直在四处搜索,试图找到有关JPA和Hibernate搜索用于查询数据的方法的信息。有大量数据,但大多数(如果不是全部的话)都包含非常高级的术语。我正在努力理解两者之间的差异。如果有人能给我指一些能以更简单的方式解释这两件事的东西,那就太好了。我来自Java(但以前从未使用Java数据库)和PHP背景(使用PHP数据库) CheersJPA是访问关系数据库的标准API。这是一个ORM:对象关系映射器。它允许从数据库中获取/保存对象图,而不是行和列 Hibernate是JPAAPI的一个实现 H

我一直在四处搜索,试图找到有关JPA和Hibernate搜索用于查询数据的方法的信息。有大量数据,但大多数(如果不是全部的话)都包含非常高级的术语。我正在努力理解两者之间的差异。如果有人能给我指一些能以更简单的方式解释这两件事的东西,那就太好了。我来自Java(但以前从未使用Java数据库)和PHP背景(使用PHP数据库)


Cheers

JPA是访问关系数据库的标准API。这是一个ORM:对象关系映射器。它允许从数据库中获取/保存对象图,而不是行和列

Hibernate是JPAAPI的一个实现

Hibernate搜索插入Hibernate,以便能够对数据库中持久化的对象(或对象的一部分)执行全文查询。我们的目标是能够执行类似google的查询,而不是(或除了)传统的SQL查询


Hibernate搜索使用幕后操作。

JPA是访问关系数据库的标准API。这是一个ORM:对象关系映射器。它允许从数据库中获取/保存对象图,而不是行和列

Hibernate是JPAAPI的一个实现

Hibernate搜索插入Hibernate,以便能够对数据库中持久化的对象(或对象的一部分)执行全文查询。我们的目标是能够执行类似google的查询,而不是(或除了)传统的SQL查询


Hibernate搜索使用幕后操作。

好吧,它们基本上都是SQL之上的花式包装器/抽象器。抽象分为多个层次:

  • 首先,直接SQL查询(几乎)完全隐藏,两个框架都公开了更高级别的(但仍然类似于synthax中的SQL)语言。这主要是为了使您的应用程序独立于由不同数据库供应商实现的各种SQL怪癖。想想jQueryDOM操作API,而不是标准(和特定于浏览器的)纯Javascript。这种语言抽象在Hibernate中称为HQL(Hibernate查询语言),在JPA中称为JPQL(Java持久性查询语言)。它们都非常相似,事实上,我认为JPQL深受HQL的启发。以下是一个基本示例:
SQL查询,例如

SELECT * FROM Persons
可以用JPQL表示为:

SELECT p FROM Person p
在HQL中:

FROM Person p
显然还有更多的内容,而且由于框架(顾名思义)试图将关系数据映射到对象,因此它们的高级查询语言可以处理对象。我认为,在深入研究细节之前,从一开始就要理解的一个重要事实是,无论您使用JPA或Hibernate编写什么查询代码,它都将被转换为特定于当前数据库的SQL,并针对它执行。Hibernate(它本身和它的JPA实现)有一个很好的特性,可以记录所有生成的SQL。只需在hibernate配置中将“hibernate.show_sql”(也可能是“hibernate.format_sql”)配置参数添加为true。例如,对于Hibernate JPA项目,您需要将它们添加到persistence.xml文件中的持久性单元声明中,如下所示:

<persistence>

    <persistence-unit name="some_name">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <!-...->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
尝试激活此功能并使用JPQL或HQL,看看在SQL级别实际发生了什么。这可能会让您更好地了解更高级别的API是如何工作的

  • 目前Hibernate和JPA(从版本2开始)提供了另一个用于查询数据的抽象API,称为CriteriaAPI。这里的基本思想是,它完全抛弃了类似SQL的语法(和范例),而采用了完全面向对象的查询API。下面是一个快速的JPA示例:

    CriteriaQuery cq=cb.createQuery(Person.class)

    Root-fromPerson=cq.from(Person.class);
    CriteriaQuery selectFromPerson=cq.select(fromPerson);
    
是的,它看起来很奇怪,但它有它的用途(想象一下,尝试根据一些运行时参数动态创建一个查询,这些参数可能是设置的,也可能不是设置的,等等)

同样,纯Hibernate和Hibernate JPA都有非常相似的API实现。此外,通过这种方式进行的查询可以转换为SQL,您可以记录和研究它

根据您关于JPA和Hibernate的问题,以下是故事:

首先是冬眠。一个独立的第三方框架,它提供了一种将SQL数据映射到Java类和对象的方法。 然后JavaEE的人认为这是一个好主意,并制作了自己的版本,名为JPA。由于这些家伙坚持只制作规范的理念,并允许第三方实际实现这些规范,JPA本身只是一堆接口和一个详细说明它们应该如何工作的长文档(查看JPA 2.0)。所以在所有这些都完成之后,决定实现JPA规范的潜在第三方之一就是Hibernate。由于JPA规范与已经存在(并且完全实现)的Hibernate框架非常相似,所以他们决定沿着Hibernate构建它。因此,在Hibernate框架中,您既有原始的Hibernate API和实现(与JPA规范无关),也有JPA实现。你甚至可以同时使用它们,尽管这不是一个好的做法

现在,Oracle Java人员在完成规范之后,也自己实现了这些规范。他们倾向于使用大多数规范API来实现这一点。这个实现称为EclipseLink,您可以查看它。从理论上讲,你的JPA项目应该在exac上运行
Root<Person> fromPerson = cq.from(Person.class);
CriteriaQuery<Person> selectFromPerson = cq.select(fromPerson);