2017-03-03 48 views
0

整个对象,我有以下类别:获取主键,而不是在一对多的关系

@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 

} 

我创建了一个Web服务的球衣与CRUD操作的DAO类治疗​​数据。通过这个实现,当我调用GET方法时,我得到​​之内的整个Elements对象。这就是所谓的DAO方法:

public List<Alarms> getAlarms(){ 
    Session session = SessionUtil.getSession();  
    Query query = session.createQuery("from Alarms"); 
    List<Alarms> alarms = query.list(); 
    session.close(); 
    return alarms; 
} 

我不希望这fetch = FetchType.EAGER提取类型,因为我只需要的Elements的PK,但是经过一番研究,这是我发现让我的服务工作的唯一办法。 我试过thisthis的方法,但我一直无法使它工作。

回答

0

您可以在查询中使用左外连接提取。

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

现在你可以保持fetch = FetchType.LAZY(这是默认值)。

+0

它没有工作,返回的结果相同 – Juan

+0

前取不急于类似,它只是另一种方式来获得渴望 –

+0

是的数据,但在这种情况下,你只有当你需要得到相关的对象。不是每次。 –

0

尝试将@XmlTransient注释添加到您要忽略的Elements类中的字段。 这样的:

@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 
} 
0

您可以使用多选与Tuple,只能选择特定的列。

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); 
    } 
相关问题