Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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
Java 获取主键,而不是OneToMany关系中的整个对象_Java_Hibernate_Jpa - Fatal编程技术网

Java 获取主键,而不是OneToMany关系中的整个对象

Java 获取主键,而不是OneToMany关系中的整个对象,java,hibernate,jpa,Java,Hibernate,Jpa,我有以下课程: @Entity @Table(name = "elements") @Inheritance(strategy=InheritanceType.JOINED) @XmlRootElement public abstract class Elements implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strate

我有以下课程:

@Entity
@Table(name = "elements")
@Inheritance(strategy=InheritanceType.JOINED)
@XmlRootElement
public abstract class Elements implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idelement")
    private Integer idElement;

    @Basic(optional = false)
    @Column(name = "code")
    private String code;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "idElement")
    @Fetch(value = FetchMode.SUBSELECT)
    private Collection<Alarms> alarmsCollection;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "idElement")
    @Fetch(value = FetchMode.SUBSELECT)
    private Collection<ElementsHistorical> elementsHistoricalCollection;   

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "elementsCollection")
    @Fetch(value = FetchMode.SUBSELECT)
    private Collection<ElementsGroups> elementsGroupsCollection;


    //Constructors, getters and setters
}

@Entity
@Table(name = "alarms")
@XmlRootElement(name = "Alarms")
public class Alarms implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idalarm")
    private Integer idAlarm;

    @JoinColumn(name = "idelement", referencedColumnName = "idelement")
    @ManyToOne(optional = false)
    private Elements idElement;

    //Constructors, getters and setters

}
我不想要这个
fetch=FetchType.EAGER
FetchType,因为我只需要
元素的PK
,但经过一些研究,这是我发现的让我的服务工作的唯一方法。
我尝试过并接近了,但我无法让它工作。

您可以在查询中使用左外部连接获取

Query query = session.createQuery("from Alarms alarm left outer join fetch alarm.idElement element");

现在,您可以保持fetch=FetchType.LAZY(默认设置)。

尝试将@xmltransive注释添加到元素类中要忽略的字段中。 像这样:

@Entity
@Table(name = "elements")
@Inheritance(strategy=InheritanceType.JOINED)
@XmlRootElement
public abstract class Elements implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idelement")
    private Integer idElement;

    @Basic(optional = false)
    @Column(name = "code")
    @XmlTransient
    private String code;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "idElement")
    @Fetch(value = FetchMode.SUBSELECT)
    @XmlTransient
    private Collection<Alarms> alarmsCollection;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "idElement")
    @Fetch(value = FetchMode.SUBSELECT)
    @XmlTransient
    private Collection<ElementsHistorical> elementsHistoricalCollection;   

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "elementsCollection")
    @Fetch(value = FetchMode.SUBSELECT)
    @XmlTransient
    private Collection<ElementsGroups> elementsGroupsCollection;


    //Constructors, getters and setters
}
@实体
@表(name=“elements”)
@继承(策略=InheritanceType.JOINED)
@XmlRootElement
公共抽象类元素实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=假)
@列(name=“idelement”)
私有整数元素;
@基本(可选=假)
@列(name=“code”)
@XmlTransient
私有字符串码;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“ideElement”)
@Fetch(值=FetchMode.SUBSELECT)
@XmlTransient
私人收集警报收集;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“ideElement”)
@Fetch(值=FetchMode.SUBSELECT)
@XmlTransient
私人收藏元素私人收藏;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.PERSIST,mappedBy=“elementscolection”)
@Fetch(值=FetchMode.SUBSELECT)
@XmlTransient
私有集合元素组集合;
//构造函数、getter和setter
}

对于仅选择特定列,可以使用multiselect with

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq = cb.createTupleQuery();
    Root<Alarms> root = cq.from(Alarms.class);
    CollectionJoin<Object, Object> joinCollection = root.joinCollection("alarmsCollection");
    cq.multiselect(joinCollection.get("idElement"));
    List<Tuple> tupleResult = entityManager.createQuery(cq).getResultList();
    for (Tuple t : tupleResult) {
        Long idElement = (Long) t.get(0);
    }
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createTupleQuery();
根根=cq.from(Alarms.class);
CollectionJoin-joinCollection=root.joinCollection(“alarmsCollection”);
cq.multiselect(joinCollection.get(“ideElement”);
List tupleResult=entityManager.createQuery(cq.getResultList();
for(Tuple t:tupleResult){
Long idElement=(Long)t.get(0);
}

它不起作用,它返回与beforeFETCH相同的结果。Fetch类似于Earge,这只是获取数据的另一种方式。是的,但在这种情况下,您只在需要时获取关联对象。不是每次。
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq = cb.createTupleQuery();
    Root<Alarms> root = cq.from(Alarms.class);
    CollectionJoin<Object, Object> joinCollection = root.joinCollection("alarmsCollection");
    cq.multiselect(joinCollection.get("idElement"));
    List<Tuple> tupleResult = entityManager.createQuery(cq).getResultList();
    for (Tuple t : tupleResult) {
        Long idElement = (Long) t.get(0);
    }