スポンサーとスタディの 2 つのテーブルがあります。スポンサーおよびスタディの表の列は次のとおりです。
スポンサー テーブルの構造:
SponsorId: int primary key auto_increment,
SponsorName: varchar(30) unique not null,
Address: varchar(255)
研究テーブルの構造:
StudyId int primary key auto_increment,
StudyName varchar(30) unique not null,
SponsorId int not null foreign key to Sponsors table.
Study to Sponsor には ManyToOne の関係があります。
Sponsors と Study のフィールドをデータテーブルに表示し、作成、更新、および削除操作を実行しようとしています。
これは、データテーブルの作成に使用した方法です。
public List retrieveStudy() {
Query query=getEntityManager().createNativeQuery("select"+
"s.studyId,s.studyName,s.sponsorId ,sp.sponsorName as"+
"sponsorName,sp.address from Study s left join Sponsors sp",
Study.class);
return query.getResultList();
}
Study のデータテーブルを表示しているときに、SponsorId の代わりに SponsorName を表示したいので、結合クエリを使用して SponsorName を取得しました。
データテーブルに SponsorName を表示できるようになりましたが、レコードを追加すると次の例外が発生します。
[EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): orgException .eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'SponsorName' in 'field list'
Error Code: 1054
これはスタディ用のエンティティ クラスです。
public class Study implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "StudyId")
private Integer studyId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "StudyName")
private String studyName;
@JoinColumn(name = "SponsorId", referencedColumnName = "SponsorId")
@ManyToOne(optional = false)
private Sponsors sponsorId;
@Column(name="SponsorName")
private String sponsorName;
// Constructors getters,setters
}
JSFページ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/SRAtemplate.xhtml">
<ui:define name="head">
<title> Study </title>
</ui:define>
<ui:define name="heading">
Study
</ui:define>
<ui:define name="body">
<br/>
<p:growl id="msg" autoUpdate="true"/>
<br/>
<h:form id="addstudyform">
<p:panelGrid columns="2" styleClass="panelgridstyle">
<f:facet name="header">
Add Study
</f:facet>
<h:outputLabel for="StudyName" value="StudyName*:"/>
<p:inputText id="StudyName" value="#studyController.selected.studyName}" maxlength="20"
required="true" requiredMessage="StudyName must be entered"
validatorMessage="StudyName must be an alphanumeric value">
<f:validateRegex pattern="[a-zA-Z0-9\s]+"/>
</p:inputText>
<h:outputLabel for="Sponsor" value="Sponsor*:"/>
<p:selectOneMenu id="Sponsor" value="#{studyController.selected.sponsorId}" effect="fade" effectSpeed="0"
required="true" requiredMessage="Sponsor must be selected">
<f:selectItems value="#{sponsorsController.itemsAvailableSelectOne}" var="sponsor"
itemLabel="#{sponsor.sponsorId}" itemValue="#{sponsor}"/>
</p:selectOneMenu>
<p:commandButton id="btnSaveStudy" value="Save" actionListener="#{studyController.createStudy()}"
update=":studyform:studydt"/>
<p:commandButton id="btnCancelStudy" value="Clear" type="reset" update=":addstudyform"/>
</p:panelGrid>
</h:form>
<br/>
<br/>
<h:form id="studyform" style="alignment-adjust:middle">
<p:dataTable id="studydt" value="#{studyController.retrieveStudy()}" var="item"
paginator="true" rows="15" emptyMessage="No Records Found">
<p:column filterStyleClass="filterstyle" filterBy="#{item.studyName}"
filterMatchMode="startsWith" style="text-align: left;">
<f:facet name="header"> StudyName </f:facet>
<h:outputText value="#{item.studyName}"/>
</p:column>
<p:column filterStyleClass="filterstyle" filterBy="#{item.sponsor}"
filterMatchMode="startsWith" style="text-align: center;">
<f:facet name="header"> Sponsor </f:facet>
<h:outputText value="#{item.sponsorName}"/>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</html>
これは perisistence.xml ファイルです
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ABCPU" transaction-type="JTA">
<jta-data-source>jdbc/ABC</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
<properties>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<property name="eclipselink.jdbc.batch-writing" value="Buffered"/>
<property name="eclipselink.logging.level" value="INFO"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>
</persistence>
アップデート
Study エンティティに SponsorName 列を追加したため、エラーが発生していると思います。
あるエンティティの列を別のエンティティにマップできますか?
はいの場合、誰かが私にそれを行う方法を提案できますか.