我有两个java对象。


用户(每个用户都有一个索引列)
地址(每个地址也都有一个user_index列)


我有一个所有用户索引列表的列表,作为给定输入usersIndexList,我想基于此usersIndexList获取所有地址对象。我在另一个线程上找到了一个例子。并尝试遵循它,但是它不起作用。

JPA CriteriaBuilder - How to use "IN" comparison operator

我的代码:

List<String> usersIndexList= new ArrayList<String> ();
for (User u : usersList) {
    usersIndexList.add(u.getIndex());
}

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<User> subQuery = criteriaBuilder.createQuery(User.class);
    Root<User> fromUser= subQuery.from(User.class);

    Expression<String> exp = fromUser.get("user_index");
    Predicate predicate = exp.in(usersIndexList);

    subQuery.where(predicate);

    TypedQuery<User> query = getEntityManager().createQuery(subQuery);

    return query.getResultList();


但是此查询未返回期望的结果:(

有人可以告诉我我做错了什么吗,或者可以通过nativequerynamedquery或其他任何方式给我替代解决方案

最佳答案

根据您的问题,您想基于此usersIndexList获取所有地址对象。但是在您的代码中,您选择的是User对象,而不是Address。我的理解正确吗?如果是,则将您的根目录更改为Address,如下所示-

List<String> usersIndexList= new ArrayList<String> ();
for (User u : usersList) {
    usersIndexList.add(u.getIndex());
}

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Address> subQuery = criteriaBuilder.createQuery(Address.class);
    Root<Address> fromAddress= subQuery.from(Address.class);

    Expression<String> exp = fromAddress.get("user_index");
    Predicate predicate = exp.in(usersIndexList);

    subQuery.where(predicate);

    TypedQuery<Address> query = getEntityManager().createQuery(subQuery);

    return query.getResultList();

09-08 07:05