Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA多选_Jpa_Criteria - Fatal编程技术网

JPA多选

JPA多选,jpa,criteria,Jpa,Criteria,我使用EclipseLink作为JPA提供商 我想做一个查询,通过在线单条件查询获得与某些ID对应的所有名称 Root<UserAccount> root = criteria.from(UserAccount.class); List<Selection<?>> select = new ArrayList<Selection<?>>(); for (MyElement element : list) { Express

我使用EclipseLink作为JPA提供商

我想做一个查询,通过在线单条件查询获得与某些ID对应的所有名称

Root<UserAccount> root = criteria.from(UserAccount.class);
List<Selection<?>> select = new ArrayList<Selection<?>>();
    for (MyElement element : list) {
   Expression<String> firstName = root.get("firstName");
   Expression<String> lastName = root.get("lastName");
   Expression<Integer> id = root.get("id");
   select.add(criteria
                .multiselect(
                        firstName.alias(element.getId() + "_"
                                + element.getEntity() + "f"),
                        lastName.alias(element.getId() + "_"
                                + element.getEntity() + "l"))
                .where(criteriaBuilder.equal(id, element.getAuthorId()))
                .from(UserAccount.class)
                .alias(element.getId() + "_" + element.getEntity()));
}
criteria.multiselect(select);
TypedQuery<Tuple> q = em.createQuery(criteria);
for (Tuple t : q.getResultList()) {
        for (OverviewEntity element : list) {
 System.out.println("////"
                        + t.get(element.getId().toString() + "_"+element.getEntity()+"f",
                                String.class));
通过element.getId+\u+element.getEntity+f,我打算创建一个唯一的别名


问题是我得到的都是空的。为什么?我应该如何在一个查询中获得所有这些信息,这样才不会变得耗时?

正如评论中所建议的,我会选择一个更简单的解决方案,如

List<Integer> myList = ....;  // place here your ids
TypedQuery<UserAccount> q = em.createQuery("select u from UserAccount u where u.id in (:myList)", UserAccount.class);
返回的resultList包含附加到PersistenceContext的实体实例。这意味着您将能够毫不费力地获得瞬态属性


关于性能,只有在极端情况下,如返回列表的大小非常大,或者必须频繁重复此查询时,才会有显著的差异。但这需要深入分析。

正如评论中所建议的,我会选择一个更简单的解决方案,如

List<Integer> myList = ....;  // place here your ids
TypedQuery<UserAccount> q = em.createQuery("select u from UserAccount u where u.id in (:myList)", UserAccount.class);
返回的resultList包含附加到PersistenceContext的实体实例。这意味着您将能够毫不费力地获得瞬态属性


关于性能,只有在极端情况下,如返回列表的大小非常大,或者必须频繁重复此查询时,才会有显著的差异。但这需要深入分析。

您的代码似乎非常混乱和过于复杂

JPQL

Select u.firstName, u.lastName, u.id from UserAccount u where u.id in (:ids)
看起来很有效

在这个标准中,

Root<UserAccount> root = criteria.from(UserAccount.class);
criteria.multiselect(root.get("firstName"), root.get("lastName"), root.get("id"));
criteria.where(criteriaBuilder.in(root.get("id"), criteriaBuilder.parameter("ids"));

您的代码看起来非常混乱和过于复杂

JPQL

Select u.firstName, u.lastName, u.id from UserAccount u where u.id in (:ids)
看起来很有效

在这个标准中,

Root<UserAccount> root = criteria.from(UserAccount.class);
criteria.multiselect(root.get("firstName"), root.get("lastName"), root.get("id"));
criteria.where(criteriaBuilder.in(root.get("id"), criteriaBuilder.parameter("ids"));

为什么要创建唯一的别名?什么是element.getEntity?@perissf的想法是,当我得到结果时,我想知道所有结果适合哪里。ID不够,数据库信息中还有一些@Transientnot。这个设计看起来很复杂。我将编写一个简单的查询,返回给定集合中Id为的所有UserAccount记录。resultList将附加到PersistenceContext,您无需任何努力即可获得瞬态属性…无需使用aliases@perissf你是对的,可能更容易得到它们,并且有一个列表,通过迭代来解决所有的问题。但这不就是因为我得到了整个实体,而不仅仅是这3个字段,所以我的查询速度就慢了吗?请发布答案,以便我可以接受。为什么要创建唯一的别名?什么是element.getEntity?@perissf的想法是,当我得到结果时,我想知道所有结果适合哪里。ID不够,数据库信息中还有一些@Transientnot。这个设计看起来很复杂。我将编写一个简单的查询,返回给定集合中Id为的所有UserAccount记录。resultList将附加到PersistenceContext,您无需任何努力即可获得瞬态属性…无需使用aliases@perissf你是对的,可能更容易得到它们,并且有一个列表,通过迭代来解决所有的问题。但这不就是因为我得到了整个实体,而不仅仅是这3个字段,所以我的查询速度就慢了吗?请张贴一个答案,这样我就可以接受它。谢谢提供的代码。然而,问题是:一个元素可以是A类型或“B”类型。我可以找出它是什么类型的:element.getEntity。当我得到结果时,我应该知道返回的id及其对应的firstName和lastName是属于A还是属于B。这就是问题所在,不仅仅是从数据库中获取字符串。感谢提供的代码。然而,问题是:一个元素可以是A类型或“B”类型。我可以找出它是什么类型的:element.getEntity。当我得到结果时,我应该知道返回的id及其对应的firstName和lastName是属于A还是属于B。这就是问题所在,而不仅仅是从数据库中获取字符串。