2017-01-07 2 views
0

У меня есть две разные таблицы: subjects и questions, и мне нужно сделать SQL JOIN в этих двух таблицах. Таблица subjects имеет следующие атрибуты: name и shortcut. Таблица questions имеет свои атрибуты: question_number, text, subject - фактически, subject из таблицы questions является shortcut из subject.EclipseLink EntityManager SQL JOIN на двух таблицах

Я пытался что-то вроде этого, что я видел в один StackOverflow тему:

Query q = em.createNativeQuery("SELECT q.question_number, q.text, s.name, s.shortcut FROM " 
            + "(questions q INNER JOIN subjects s ON q.subject=s.shortcut);", QuestionSubject.class); 

QuestionSubject.class является @Entity класса и имеет атрибуты как questions таблицы и subjects таблицы. После вызова этого метода я увидел, что в моей базе была создана новая таблица с именем QUESTIONSUBJECT, и это то, чего я не хочу делать.

Может ли кто-нибудь помочь мне с другим решением?

P.S .: Я делаю это, чтобы использовать вывод в качестве ответа по HTTP-запросу, поэтому мне нужно собрать эти два в одном. Мне нужно вернуть либо строку List, либо JSON.

EDIT: Использование базы данных MySQL.

questions таблица класса Entity:

package model; 

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 

@Entity 
@Table(name = "questions") 
@XmlRootElement 
public class Question implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Basic(optional = false) 
    @Column(name = "question_number") 
    private Integer questionNumber; 
    @Column(name = "text") 
    private String text; 
    @Column(name = "subject") 
    private String subject; 

    public Question() { 
    } 

    public Question(Integer questionNumber) { 
     this.questionNumber = questionNumber; 
    } 

    public Question(String text, String subject) { 
     this.text = text; 
     this.subject = subject; 
    } 

    public Question(Integer questionNumber, String text, String subject) { 
     this.questionNumber = questionNumber; 
     this.text = text; 
     this.subject = subject; 
    } 

    public Integer getQuestionNumber() { 
     return questionNumber; 
    } 

    public void setQuestionNumber(Integer questionNumber) { 
     this.questionNumber = questionNumber; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public String getSubject() { 
     return subject; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (questionNumber != null ? questionNumber.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Question)) { 
      return false; 
     } 
     Question other = (Question) object; 
     if ((this.questionNumber == null && other.questionNumber != null) || (this.questionNumber != null && !this.questionNumber.equals(other.questionNumber))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Rest.Questions[ questionNumber=" + questionNumber + " ]"; 
    } 

} 

subjects таблица класса Entity.

package model; 

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
import javax.xml.bind.annotation.XmlRootElement; 

@Entity 
@Table(name = "subjects") 
@XmlRootElement 
public class Subject implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 5) 
    @Column(name = "shortcut") 
    private String shortcut; 
    @Basic(optional = false) 
    @NotNull 
    @Lob 
    @Size(min = 1, max = 65535) 
    @Column(name = "name") 
    private String name; 

    public Subject() { 
    } 

    public Subject(String shortcut) { 
     this.shortcut = shortcut; 
    } 

    public Subject(String shortcut, String name) { 
     this.shortcut = shortcut; 
     this.name = name; 
    } 

    public String getShortcut() { 
     return shortcut; 
    } 

    public void setShortcut(String shortcut) { 
     this.shortcut = shortcut; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (shortcut != null ? shortcut.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Subject)) { 
      return false; 
     } 
     Subject other = (Subject) object; 
     if ((this.shortcut == null && other.shortcut != null) || (this.shortcut != null && !this.shortcut.equals(other.shortcut))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Rest.Subjects[ shortcut=" + shortcut + " ]"; 
    } 

} 

QuestionSubject Entity Класс:

package model; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class QuestionSubject implements Serializable 
{ 
    @Id 
    @Column(name = "question_number") 
    private Integer questionNumber; 
    @Column(name = "text") 
    private String text; 

    @Column(name = "shortcut") 
    private String shortcut; 
    @Column(name = "name") 
    private String name; 

    public Integer getQuestionNumber() { 
     return questionNumber; 
    } 

    public void setQuestionNumber(Integer questionNumber) { 
     this.questionNumber = questionNumber; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public String getShortcut() { 
     return shortcut; 
    } 

    public void setShortcut(String shortcut) { 
     this.shortcut = shortcut; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

Я никогда не использовал EclipseLink в качестве поставщика JPA (и я не знаю, какая база данных позади), но я думаю, что таблицы не создаются во время запроса. Обычно сопоставления (определения классов) определяют структуру таблицы, а таблицы создаются при запуске. Можете ли вы отправить код связанных классов? –

+0

Эта команда создала новую таблицу во время запроса.Конечно, я загружу его через 2 минуты – scarface

ответ

1

таблица будет создаваться, потому что вы определяете класс с именем QuestionSubject аннотированный в @Entity. По умолчанию имя таблицы - это имя класса.

Вы можете переопределить имя, как вы делали в Subjects с @Table(name = "subjects")

Почти то же самое произошло бы, если бы вы определить @ManyToMany отображение на смежных областях между классами Question и Subject без определения QuestionSubject класса вообще.

Я бы порекомендовал посмотреть здесь, чтобы получить больше информации:

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Relationship_Mappings/Collection_Mappings/ManyToMany

Редактировать Если вам необходимо отображение manyToMany вам нужна эта таблица. В противном случае у вас может быть только oneToMany или. manyToOne (используя внешние ключи).

+0

На самом деле, правда ли, что когда я создаю отношение многих ко многим в SQL, создается ли новая таблица, которая представляет этот факт? – scarface

+0

Несомненно, как много должно быть отношение ManyToMany в противном случае? Он называется «join table», «таблица сопоставления» или аналогичный. –

Смежные вопросы