在Java中查询对象集合(Criteria/SQL-like)有多种方式,以下是一些常见的方法:
Java 8引入了新的Stream API,允许您在程序中创建实时和表达式导向的数据操作,它类似于操作列表的SQL查询。这是使用Java 8 Stream API查询对象集合的简单示例:
List<Person> people = Arrays.asList(
new Person("Alice", "A123"),
new Person("Bob", "B456"),
new Person("Carol", "C789")
);
List<String> namesStartingWithA = people.stream()
.filter(p -> p.getName().startsWith("A"))
.map(p -> p.getName())
.sorted()
.collect(toList());
System.out.println(namesStartingWithA); // 输出 [Alice, Carol]
您也可以使用Java 8的标准谓词(Predicate)或Lambda表达式来构建自定义的查询条件。下面是一个使用标准谓词的例子:
List<Person> people = ...;
Predicate<Person> startsWithA = p -> p.getName().startsWith("A");
List<String> namesStartingWithA = people.stream()
.filter(startsWithA)
.map(p -> p.getName())
.sorted()
.collect(toList());
使用Criteria API,您可以更精确地控制查询行为。该API类似于SQL语句或Hibernate实体查询语言(HQL)的扩展。以下是一个使用Criteria API来筛选姓名的例子:
List<Person> people = ...;
Query q = entityManager.createQuery("FROM People p WHERE p.name.startswith('A')");
List<String> namesStartingWithA = q.getResultList();
在使用JPA的情况下,您也可以使用Hibernate Criteria API来构建自定义的查询标准。下面的示例演示了如何使用Hiberate Criteria筛选姓名的例子:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<String> cq = criteriaBuilder.createQuery(String.class);
Root<Person> root = cq.from(Person.class);
criterion = criteriaBuilder.equal(root.get("name").as(String.class), "Alice");
Predicate predicate = criterion.getRestriction();
List namesStartingWithA = entityManager.createQuery(cq.select(root.get("name")).where(predicate)).getResultList();
领取专属 10元无门槛券
手把手带您无忧上云