У меня есть две разные таблицы: 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;
}
}
Я никогда не использовал EclipseLink в качестве поставщика JPA (и я не знаю, какая база данных позади), но я думаю, что таблицы не создаются во время запроса. Обычно сопоставления (определения классов) определяют структуру таблицы, а таблицы создаются при запуске. Можете ли вы отправить код связанных классов? –
Эта команда создала новую таблицу во время запроса.Конечно, я загружу его через 2 минуты – scarface