JPA多选
我使用EclipseLink作为JPA提供商 我想做一个查询,通过在线单条件查询获得与某些ID对应的所有名称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
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。这就是问题所在,而不仅仅是从数据库中获取字符串。