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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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 TupleQuery中获取Id_Jpa_Eclipselink - Fatal编程技术网

仅在JPA TupleQuery中获取Id

仅在JPA TupleQuery中获取Id,jpa,eclipselink,Jpa,Eclipselink,难道不可能只从外部对象获取id吗 简单的例子: class Person { int id; String name; @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID") @ManyToOne(fetch = FetchType.LAZY) Address addressesId } class Address { int id; String city; } CriteriaBui

难道不可能只从外部对象获取id吗

简单的例子:

class Person {
   int id;
   String name;
   @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID")
   @ManyToOne(fetch = FetchType.LAZY)
   Address addressesId
}

class Address {
  int id;
  String city;
}

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery();
Root<Person> from = q.from(Person.class);
q.multiselect(from.get(Person_.name),
              from.get(Person_.AdresseId);
TypedQuery<Tuple> query = em.createQuery(q);
List<Tuple> resultList = query.getResultList();
班级人员{
int-id;
字符串名;
@JoinColumn(name=“ADDRESS\u ID”,referencedColumnName=“ID”)
@manytone(fetch=FetchType.LAZY)
地址ID
}
班级地址{
int-id;
字符串城市;
}
CriteriaBuilder CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery q=criteriaBuilder.createTupleQuery();
Root-from=q.from(Person.class);
q、 多重选择(从.get(人名),
from.get(人/地址id);
TypedQuery=em.createQuery(q);
List resultList=query.getResultList();
我只需要Person表中当然存在的来自Address的ID,但是JPA会自动生成一个内部联接查询,并且省略了具有空地址的实体。联接是不必要的。有没有办法在这个TupleQuery中只从Address获取ID


Xanas

JPA只能使用提供的映射来返回数据,并且由于Person中的地址外键是使用对象引用映射映射的,因此在查询中包含它需要JPA中的联接。获取包含空值的唯一方法是使用左外联接,如Koitoer下面所述

不过,另一种方法是为Person实体内的addressId外键创建另一个只读基本映射

class Person {
   int id;
   String name;
   @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID")
   @ManyToOne(fetch = FetchType.LAZY)
   Address address;
   @Column(name ="ADDRESS_ID", insertable=false, updatable=false)
   private Long addressId;
}
这将允许您在需要address对象实例时使用“address”属性,在查询中仅需要Foreign键值而不需要完整的address实体时使用“addressId”:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery();
Root<Person> from = q.from(Person.class);
q.multiselect(from.get(Person_.name),
              from.get(Person_.AddressId);
TypedQuery<Tuple> query = em.createQuery(q);
List<Tuple> resultList = query.getResultList();
CriteriaBuilder-CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery q=criteriaBuilder.createTupleQuery();
Root-from=q.from(Person.class);
q、 多重选择(从.get(人名),
from.get(Person\u.AddressId);
TypedQuery=em.createQuery(q);
List resultList=query.getResultList();

将从Person表返回name和addressId值,而不使用任何联接。

JPA只能使用提供的映射来返回数据,并且由于Person中的地址外键是使用对象引用映射映射映射的,因此在查询中包含它需要在JPA中进行联接。获取包含null的唯一方法是使用左外连接,如Koitoer下面所述

不过,另一种方法是为Person实体内的addressId外键创建另一个只读基本映射

class Person {
   int id;
   String name;
   @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID")
   @ManyToOne(fetch = FetchType.LAZY)
   Address address;
   @Column(name ="ADDRESS_ID", insertable=false, updatable=false)
   private Long addressId;
}
这将允许您在需要address对象实例时使用“address”属性,在查询中仅需要Foreign键值而不需要完整的address实体时使用“addressId”:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery();
Root<Person> from = q.from(Person.class);
q.multiselect(from.get(Person_.name),
              from.get(Person_.AddressId);
TypedQuery<Tuple> query = em.createQuery(q);
List<Tuple> resultList = query.getResultList();
CriteriaBuilder-CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery q=criteriaBuilder.createTupleQuery();
Root-from=q.from(Person.class);
q、 多重选择(从.get(人名),
from.get(Person\u.AddressId);
TypedQuery=em.createQuery(q);
List resultList=query.getResultList();

将从Person表返回name和addressId值,而不进行任何连接。

谢谢,听起来不错,我尝试一下Tanks,听起来不错,我尝试一下