2015-07-20 62 views
6

mi hanno classe due entità Categoria e Events.I devono unire entrambe le tabelle e recuperare tutti i record che corrispondono alla condizione dataHibernate unisce due tabelle e recupera tutti i record?

mia query SQL per questo

SELECT * FROM category c inner join `events` e on e.category_i=c.category_id where c.parent_category_id=1; 

Come posso convertire questa query sql in hql e recuperare i dati? Ho provato di seguito ma non ho ottenuto il risultato? Sono molto nuovo per il letargo

Eventi classe di entità per la mappatura hibernate

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 

/** 
* The persistent class for the user database table. 
* 
*/ 
@Entity 
@Table(name = "events") 
public class Events implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "event_id") 
    private int eventId; 

    @Column(name = "event_name") 
    private String eventName; 

    @Column(name = "event_description") 
    private String eventDescription; 

    @Column(name = "category_i") 
    private Integer categoryI; 






    public Integer getCategoryI() { 
     return categoryI; 
    } 

    public void setCategoryI(Integer categoryI) { 
     this.categoryI = categoryI; 
    } 

    @Column(name = "is_trending_event") 
    private Integer isTrendingEvent; 

    @Column(name = "image_url") 
    private String imageUrl; 

    private Integer status; 

    @Column(name = "created_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date createdDate; 

    @Column(name = "last_updated_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdatedDate; 

    public Date getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    public Date getLastUpdatedDate() { 
     return lastUpdatedDate; 
    } 

    public void setLastUpdatedDate(Date lastUpdatedDate) { 
     this.lastUpdatedDate = lastUpdatedDate; 
    } 

    public int getEventId() { 
     return eventId; 
    } 

    public void setEventId(int eventId) { 
     this.eventId = eventId; 
    } 

    public String getEventName() { 
     return eventName; 
    } 

    public void setEventName(String eventName) { 
     this.eventName = eventName; 
    } 

    public String getEventDescription() { 
     return eventDescription; 
    } 

    public void setEventDescription(String eventDescription) { 
     this.eventDescription = eventDescription; 
    } 



    public Integer getIsTrendingEvent() { 
     return isTrendingEvent; 
    } 

    public void setIsTrendingEvent(Integer isTrendingEvent) { 
     this.isTrendingEvent = isTrendingEvent; 
    } 

    public String getImageUrl() { 
     return imageUrl; 
    } 

    public void setImageUrl(String imageUrl) { 
     this.imageUrl = imageUrl; 
    } 

    public Integer getStatus() { 
     return status; 
    } 

    public void setStatus(Integer status) { 
     this.status = status; 
    } 

} 

Categoria entità

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 

/** 
* The persistent class for the user database table. 
* 
*/ 
@Entity 
@Table(name = "category") 
public class Category implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "category_id") 
    private int categoryId; 

    @Column(name = "category_name") 
    private String categoryName; 

    @Column(name = "parent_category_id") 
    private Integer parentCategoryId; 

    @Column(name = "created_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date createdDate; 

    @Column(name = "last_updated_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdatedDate; 


    @ManyToOne 
    @JoinTable(name="events", joinColumns = @JoinColumn(name="category_i")) 
    private Events events; 

    public int getCategoryId() { 
     return categoryId; 
    } 

    public void setCategoryId(int categoryId) { 
     this.categoryId = categoryId; 
    } 

    public String getCategoryName() { 
     return categoryName; 
    } 

    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 

    public Integer getParentCategoryId() { 
     return parentCategoryId; 
    } 

    public void setParentCategoryId(Integer parentCategoryId) { 
     this.parentCategoryId = parentCategoryId; 
    } 

    public Date getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    public Date getLastUpdatedDate() { 
     return lastUpdatedDate; 
    } 

    public void setLastUpdatedDate(Date lastUpdatedDate) { 
     this.lastUpdatedDate = lastUpdatedDate; 
    } 

} 

Fetch categoria metodo

public List<Object[]> getCategoryList(int id) throws SQLException, ClassNotFoundException, IOException { 
     List<Object[]> groupList = null; 
     try { 
      Session session = sessionFactory.getCurrentSession(); 
      Query query = session.createQuery("select e from Category e inner join e.events where e.parentCategoryId=1"); 
      //query.setParameter("id", id); 
      groupList = query.list(); 
     } catch (Exception e) { 
     } 
     return groupList; 
    } 
+0

È possibile utilizzare criteri di Hibernate e non v'è una proprietà per recuperare aderire. – Darshan

+0

@Darshan gentilmente, per favore aiutami a fare questo. :( – Stella

+1

La mappatura è sbagliata, stai pensando che JDBC non sia in ibernazione, stai mappando gli oggetti e non gli ID. Nel tuo 'Evento 'dovresti avere un oggetto' Category' invece di un id. –

risposta

6

È necessario pensare in termini di oggetti Java quando si utilizzano gli strumenti ORM.

Dalla tua domanda credo che la query che si sta tentando di scrivere avrà un aspetto simile:

public List<Category> getCategoryList(int id) { 
    List<Category> groupList; 
    Session session = sessionFactory.getCurrentSession(); 
    Query query = session.createQuery("select c from Category c join fetch c.events where c.parentCategory.categoryId = 1"); 
    //query.setParameter("id", id); 
    groupList = query.list(); 
    return groupList; 
} 

Uno dei vantaggi di utilizzare un ORM è che funziona la query full unirsi per voi.

Per far funzionare tutto questo è necessario per aggiornare il modello di classe come segue:

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 

@Entity 
@Table(name = "events") 
public class Event implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "event_id") 
    private int eventId; 

    @Column(name = "event_name") 
    private String eventName; 

    @Column(name = "event_description") 
    private String eventDescription; 

    @ManyToOne 
    @JoinColumn(name = "category_i") 
    private Category category; 

    @Column(name = "is_trending_event") 
    private Integer isTrendingEvent; 

    @Column(name = "image_url") 
    private String imageUrl; 

    private Integer status; 

    @Column(name = "created_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date createdDate; 

    @Column(name = "last_updated_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdatedDate; 

    ... 

} 

e

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 

@Entity 
@Table(name = "category") 
public class Category implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "category_id") 
    private int categoryId; 

    @Column(name = "category_name") 
    private String categoryName; 

    @ManyToOne 
    @JoinColumn(name="parent_category_id") 
    private Category parentCategory; 

    @Column(name = "created_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date createdDate; 

    @Column(name = "last_updated_date") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdatedDate; 

    @OneToMany(mappedBy="category") 
    private List<Event> events; 

    ... 

} 
+0

Questa è la mia query sql 'SELECT * FROM categoria c inner join events e su e.category_i = c.category_id dove c.parent_category_id = 1;' il motivo per cui ho bisogno di unire 'parent_category_id' in Category entity? puoi spiegare per favore? – Stella

+0

È necessario pensare a quali dati 'SELECT * FROM c categoria c inner join events e' viene restituito e come si esegue il mapping degli oggetti java. Sembra che tu stia cercando tutti gli oggetti 'Event' e la loro' categoria' associata dove il genitore della categoria ha 'categoryId = 1'? –

+0

per ulteriori dettagli sulle tabelle e il recupero dei dati, per favore dare un'occhiata alla domanda che ho chiesto e non ho avuto una risposta http://stackoverflow.com/questions/31476416/hibernate-joining-two-table-and-producing -json-response-in-spring-restful-webser – Stella

0

Questa query dovrebbe fare il lavoro:

from Category as c 
inner join c.events as e 
where c.parentCategoryId = 1 

Inoltre ti sembra di avere un errore di battitura (mancante "d" alla fine) qui:

@JoinColumn(name="category_i"))

+0

@JoinColumn (name = "category_i")) questo è in realtà il nome della colonna per l'unione nella tabella degli eventi .i ho aggiornato l'entità dell'evento. – Stella

+0

Visualizzazione dell'errore ERRORE JDBCExceptionReporter: 101 - Colonna sconosciuta 'category0_1_.events_event_id' in 'elenco campi' quando si utilizza questo – Stella

0

Ty questo codice qui sotto

public List<Object[]> getCategoryList(int id) throws SQLException, ClassNotFoundException, IOException { 


     Session session = sessionFactory.getCurrentSession(); 
     return session.createCriteria(Catagory.class) 
     .setFetchMode("events", FetchMode.JOIN) 
     .add(Restrictions.eq("parentCatagoryId", 1)) 
     .list(); 

} 

Speranza funziona questa roba.

+0

In questo dove si menzionano le colonne a cui è necessario unirsi nel mio caso devo unire la tabella delle categorie 'ID_destinazione' e tabella degli eventi 'category_i' (non chiave primaria). – Stella

+0

ie, categoria c inner join 'events' e su e.category_i = c.category_id – Stella

+0

Non abbiamo bisogno di definire quali basi di colonna ci stiamo unendo .. abbiamo già definito sulla definizione di bean. – Darshan

2

Hibernate riguarda il mapping degli oggetti e delle relazioni, tuttavia si stanno mappando campi ID semplici.

Nella classe Events si ha la followingL

@Entity 
@Table(name = "events") 
public class Events implements Serializable { 

    @Column(name = "category_i") 
    private Integer categoryI; 

} 

Tuttavia dovrebbe essere un Category invece di un Integer.

@Entity 
@Table(name = "events") 
public class Events implements Serializable { 

    @ManyToOne 
    @Column(name = "category_i") 
    private Category category; 

} 

Poi, nel tuo Category si dovrebbe aggiungere il campo mappedBy alla @ManyToOne sul campo events e rimuovere il @JoinColumn.

@Entity 
@Table(name = "category") 
public class Category implements Serializable { 

    @OneToMany(mappedBy="category") 
    private Events events; 
} 

Lo stesso vale per la parentCategoryId della classe Category.

Ora che hai corretto la mappatura, dovresti riuscire a scrivere la query come volevi.

+0

Quindi? Il nome della colonna può ancora essere lì, basta aggiungere l'annotazione. Consiglio vivamente una lettura su JPA e su come funziona. Si tratta di mappare oggetti alla struttura del tuo database. Usa la tecnologia come previsto, ci stai lavorando intorno. –

+0

puoi spiegare per favore Dove stiamo facendo la funzionalità della parola chiave qui? – Stella

+0

'@ManyToOne (mappedBy =" category ")' che mostra l'errore canot find symbol.have inteso 'OneToMany'? – Stella

Problemi correlati