私は2種類のテーブル:subjects
とquestions
を持っています。これらの2つのテーブルでSQL JOINを作成する必要があります。テーブルsubjects
の属性は、name
とshortcut
です。テーブルquestions
は、その属性を有する:question_number
,text
,subject
-実際には、テーブルquestions
のsubject
はshortcut
のsubject
である。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;
}
}
私はJPAプロバイダとしてEclipseLinkを使用したことがありませんでした(そして、どのデータベースが遅れているのかわかりませんが)が、クエリ時にテーブルが作成されないと思います。通常、マッピング(クラス定義)はテーブル構造を定義し、テーブルは起動時に作成されます。関連クラスのポストコードをお願いしますか? –
このコマンドは、クエリ時に新しいテーブルを作成しました。確かに、私は2分でアップロードします – scarface