Как выбрать несколько строк без использования JPQL? - PullRequest
2 голосов
/ 24 февраля 2020

Я использую JPA, поэтому, чтобы получить одну строку данных, я мог бы сделать:

Person p = this.em.find(Person.class, 123);
// Note: 'em' is the EntityManager.

Но как я могу получить несколько строк? Как я могу получить что-то вроде SQL SELECT * FROM people WHERE age>18;?

Я знаю, как использовать JPQL для получения нескольких строк (в данном случае, всех строк):

TypedQuery<Person> q = em.createQuery("SELECT p FROM Person p", Person.class);
List<Person> results = q.getResultList();

Но Есть ли способ сделать это без необходимости писать JPQL (то есть SELECT p FROM Person p) вообще?

Примечание. Это упражнение для обучения. Я хочу придерживаться только Jakarta EE (без Spring или любого другого API, который находится за пределами Jakarta EE).

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

CriteriaQuery - это путь к go, однако другой «стандартный» подход:

// 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);
0 голосов
/ 28 февраля 2020

Вы можете использовать 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();

, где em - это javax.persistence.EntityManager.

Примечание. Большинство людей используют JPQL вместо Criteria API. потому что JPQL (например, SELECT p FROM Person p) гораздо более краткий, чем приведенный выше код. Но API Criteria имеет преимущество перед JPQL с точки зрения безопасности типов.

Подробнее

0 голосов
/ 24 февраля 2020

Пример API CriteriaQuery:

            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Person> criteria = cb.createQuery(Person.class);
            Root<Person> root = criteria.from(Person.class);
            criteria.select(root);
            criteria.where(cb.equal(root.get("id"), 123));
            List<Person> people = em.createQuery(criteria).getResultList();

официальные документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...