2017-01-07 7 views
0

私は2種類のテーブル:subjectsquestionsを持っています。これらの2つのテーブルでSQL JOINを作成する必要があります。テーブルsubjectsの属性は、nameshortcutです。テーブルquestionsは、その属性を有する:question_number,text,subject-実際には、テーブルquestionssubjectshortcutsubjectである。2つのテーブルのEntityManager SQL JOIN

私は1つの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 .:私はこれをHTTP要求の応答として使用するためにこれを実行していますので、これら2つを1つに集める必要があります。 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クラス:あなたは@Entityとして注釈QuestionSubjectという名前のクラスを定義するため

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

私はJPAプロバイダとしてEclipseLinkを使用したことがありませんでした(そして、どのデータベースが遅れているのかわかりませんが)が、クエリ時にテーブルが作成されないと思います。通常、マッピング(クラス定義)はテーブル構造を定義し、テーブルは起動時に作成されます。関連クラスのポストコードをお願いしますか? –

+0

このコマンドは、クエリ時に新しいテーブルを作成しました。確かに、私は2分でアップロードします – scarface

答えて

1

テーブルが作成されます。デフォルトでは、テーブル名はクラス名です。あなたがすべてでQuestionSubjectクラスを定義せずに、クラスQuestionSubject間の関連分野での@ManyToManyマッピングを定義したらどうなるほぼ同じ@Table(name = "subjects")

Subjectsに行ったよう

あなたが名前をオーバーライドすることができます。

私はより多くの情報を得るために、ここで見てみることをお勧めします:

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

編集 あなたは多対多マッピングを必要とする場合は、このテーブルを必要としています。それ以外の場合は、oneToMany respのみを持つことができます。 manyToOne関係(外部キーを使用)。

+0

実際、SQLで多くの関係を作成すると、この事実を表す新しいテーブルが作成されるのは本当ですか? – scarface

+0

もちろん、manyToMany関係を他の方法で永続化する必要がありますか?これは、 'join table'、 'mapping table'などと呼ばれています。 –

関連する問題