Jpa 如何在不使用JPQL的情况下选择多行?
我正在使用JPA,因此要获得一行数据,我可以执行以下操作: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
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上的示例:
@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();