gpt4 book ai didi

jpa - 如何将集合/列表设置为 JPA 条件查询的命名参数?

转载 作者:行者123 更新时间:2023-12-05 01:48:11 25 4
gpt4 key购买 nike

可以将单个命名参数设置为 JPA 条件查询,如下所示。参数类型为 Long在这种情况下。

public StateTable find(Long id)
{
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<StateTable> criteriaQuery = criteriaBuilder.createQuery(StateTable.class);
Metamodel metamodel=entityManager.getMetamodel();
EntityType<StateTable> entityType = metamodel.entity(StateTable.class);
Root<StateTable> root = criteriaQuery.from(entityType);

ParameterExpression<Long> parameterExpression=criteriaBuilder.parameter(Long.class);
criteriaQuery.where(criteriaBuilder.equal(root.get(StateTable_.stateId), parameterExpression));

TypedQuery<StateTable> typedQuery = entityManager.createQuery(criteriaQuery);
return typedQuery.setParameter(parameterExpression, id).getSingleResult();
}

该方法内部的查询返回 StateTable 的单个对象(只说状态)我正在处理并对应于以下 JPQL 查询的实体。

entityManager.createQuery("select s from StateTable s where s.stateId=:id")
.setParameter("id", id)
.getSingleResult();

我需要找到多个与通过 java.util.List<Long> 提供的 ID 列表相对应的行.以下是标准查询的不完整版本。

public List<StateTable> find(List<Long> ids)
{
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<StateTable> criteriaQuery=criteriaBuilder.createQuery(StateTable.class);
Metamodel metamodel=entityManager.getMetamodel();
EntityType<StateTable> entityType = metamodel.entity(StateTable.class);
Root<StateTable> root = criteriaQuery.from(entityType);

ParameterExpression<Long> parameterExpression = criteriaBuilder.parameter(Long.class);
criteriaQuery.where(criteriaBuilder.in(root.get(StateTable_.stateId)).value(parameterExpression));

TypedQuery<StateTable> typedQuery = entityManager.createQuery(criteriaQuery);
return typedQuery.setParameter(parameterExpression, 1L).getResultList();
}

它使用 in()查询,但我让它只返回一行,因为我不知道是否可以将 ID 列表设置为 ParameterExpression还是不是。

简而言之,此条件查询应对应于以下 JPQL 查询。

entityManager.createQuery("from StateTable where stateId in(:id)")
.setParameter("id", ids)
.getResultList();

有没有办法设置List<Long>ParameterExpression按照规定?

最佳答案

以下方法对我有用。

public List<StateTable> find(List<Long> ids)
{
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<StateTable> criteriaQuery=criteriaBuilder.createQuery(StateTable.class);
Metamodel metamodel=entityManager.getMetamodel();
EntityType<StateTable> entityType = metamodel.entity(StateTable.class);
Root<StateTable> root = criteriaQuery.from(entityType);

//ParameterExpression<Long> parameterExpression = criteriaBuilder.parameter(Long.class);
//criteriaQuery.where(criteriaBuilder.in(root.get(StateTable_.stateId)).value(parameterExpression));
criteriaQuery.where(root.get(StateTable_.stateId).in(ids));

TypedQuery<StateTable> typedQuery = entityManager.createQuery(criteriaQuery);
return typedQuery.getResultList();
}

我刚刚添加了以下行。

criteriaQuery.where(root.get(StateTable_.stateId).in(ids));

从问题中不完整的查询版本中删除上述注释行。

关于jpa - 如何将集合/列表设置为 JPA 条件查询的命名参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com