Jpa 如何在不使用JPQL的情况下选择多行?

Jpa 如何在不使用JPQL的情况下选择多行?,jpa,select,Jpa,Select,我正在使用JPA,因此要获得一行数据,我可以执行以下操作: Person p = this.em.find(Person.class, 123); // Note: 'em' is the EntityManager. 但是我怎样才能得到多行呢?我怎样才能从年龄>18岁的人那里得到类似SQL的SELECT* 我知道如何使用JPQL获取多行(在本例中为所有行): TypedQuery q=em.createQuery(“从Person p中选择p”,Person.class); List res

我正在使用JPA,因此要获得一行数据,我可以执行以下操作:

Person p = this.em.find(Person.class, 123);
// Note: 'em' is the EntityManager.
但是我怎样才能得到多行呢?我怎样才能从年龄>18岁的人那里得到类似SQL的
SELECT*

我知道如何使用JPQL获取多行(在本例中为所有行):

TypedQuery q=em.createQuery(“从Person p中选择p”,Person.class);
List results=q.getResultList();
但是,有没有一种方法可以做到这一点而不必编写JPQL(即从Person p中选择p
)呢


注意:这是一个学习练习。我只想坚持雅加达EE(没有Spring或雅加达EE以外的任何其他API)。

CriteriaQuery
是一种方法,但另一种“标准”方法是:

// imports

@Entity
@Table(name = "Person")
@NamedQuery(
    name = "Person.queryAll",
    query = "SELECT p FROM Person p")
public class Person implements Serializable {
    ...
}
使用标准的好处是可以更早地检测到错误。编译时与运行时。然而,许多读者/开发人员发现JPQL更易于使用和理解。 使用
CriteriaQuery
将如下所示:

//skipping imports & config
  CriteriaBuilder cb = em.getCriteriaBuilder();

  CriteriaQuery<Person> q = cb.createQuery(Person.class);
  Root<Person> c = q.from(Person.class);
  q.select(c);
//跳过导入和配置
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery q=cb.createQuery(Person.class);
根c=q.from(Person.class);
q、 选择(c);

CriteriaQuery API示例:

CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery-criteria=cb.createQuery(Person.class);
Root=标准.from(Person.class);
条件。选择(根);
其中(cb.equal(root.get(“id”),123));
List people=em.createQuery(criteria).getResultList();

您可以使用Criteria API作为JPQL的替代:

// Imports.
import java.util.List;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

// Example usage of the Criteria API to get a list of all Persons in the database.
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);
TypedQuery<Person> q = em.createQuery(cq);
List<Person> allPeople = q.getResultList();
//导入。
导入java.util.List;
导入javax.persistence.TypedQuery;
导入javax.persistence.criteria.CriteriaBuilder;
导入javax.persistence.criteria.CriteriaQuery;
导入javax.persistence.criteria.Root;
//示例使用CriteriaAPI获取数据库中所有人员的列表。
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Person.class);
Root=cq.from(Person.class);
选择(根);
TypedQuery q=em.createQuery(cq);
List allPeople=q.getResultList();
其中
em
是一个
javax.persistence.EntityManager

注意:大多数人使用JPQL而不是Criteria API,因为JPQL(例如,
SELECT p FROM Person p
)比上面的代码简洁得多。但是标准API在类型安全方面比JPQL有优势

进一步阅读
  • Oracle教程:
  • Wikibooks上的示例:

我猜,您也对使用Criteria API不感兴趣,对吗?@Amseger我对JPA是新手,所以我对任何标准解决方案都持开放态度。您可以使用。您可以使用Why而不使用jpql。谢谢。我知道
@NamedQuery
,但它涉及JPQL。我不知道
CriteriaQuery
。你能举一个
CriteriaQuery
的小例子吗?@Flux看看
// Imports.
import java.util.List;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

// Example usage of the Criteria API to get a list of all Persons in the database.
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);
TypedQuery<Person> q = em.createQuery(cq);
List<Person> allPeople = q.getResultList();