使用JPA和ObjectDB通过ID选择多个对象?

Edy*_*rne 3 java jpa jpql jpa-2.0 objectdb

我无法让ObjectDB根据其ID选择多个值。我的查询非常简单:

Query query = getEntityManager().createQuery("SELECT i FROM " + getEntityClass().getSimpleName() + " i WHERE i.id IN :ids", entityClass);
query.setParameter("ids", ids);
List<Object> values = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

但是无论如何,这总是返回一个空列表。

ID列表包含所有现有ID的列表,均作为Long对象。我对此进行了三重检查。

查询如:

entityManager.find(getEntityClass(), id);
Run Code Online (Sandbox Code Playgroud)

...和...

Query query = entityManager.createQuery("SELECT i FROM " + getEntityClass().getSimpleName() + " i", entityClass);
Run Code Online (Sandbox Code Playgroud)

...工作正常。

另外,如果我这样做:EntityManager.find(getEntityClass(),1L);

我得到的结果是正确的结果:一个实例。

但:

List<Long> ids = new LinkedList<Long>();
ids.add(1L);
Query query = getEntityManager().createQuery("SELECT i FROM " + getEntityClass().getSimpleName() + " i WHERE i.id IN :ids", entityClass);
query.setParameter("ids", ids);
List<Object> values = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

向该values变量返回一个空列表。

我想念什么?这是ObjectDB不支持的东西吗?

谢谢!

Obj*_*tDB 5

它应该工作。请尝试以下简单测试:

import java.util.*;

import javax.persistence.*;

public class TestInIds {

    public static void main(String[] args) {

        EntityManagerFactory emf =
            Persistence.createEntityManagerFactory(
                "objectdb:$objectdb/db/test.tmp;drop");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        em.persist(new MyEntity());
        em.persist(new MyEntity());
        em.getTransaction().commit();

        Query query = em.createQuery("SELECT e FROM MyEntity e WHERE e.id in :ids");
        List<Long> ids = new LinkedList<Long>();
        ids.add(1L);
        query.setParameter("ids", ids);
        List resultList = query.getResultList();
        System.out.println("result size: " + resultList.size());

        em.close();
        emf.close();
    }

    @Entity
    static class MyEntity {
        @Id @GeneratedValue
        private Long id;
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该打印1。如果不尝试使用最新的ObjectDB版本。如果确实得到1作为输出,请尝试检查应用程序中的不同之处。