我使用JPA 2.1调用使用MySQL程序的能力em.createStoredProcedureQuery()
本身是否工作正常,程序返回,如MySQL工作台看到姓名和电子邮件地址的编号列表:
我的问题是与用于存储结果列表建立POJO。 我的实体类是很基本的,只有三个属性+的干将/和setter。 本发明提供一种三参数的构造和toString()方法。 请注意,有相关数据库中的这个实体没有对应的表,只有正在使用的实体来翻译的java对象的列表查询结果列表:
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class NomsEtCourriels implements Serializable {
@Id
private Integer noLigne;
private String noms;
private String courriels;
public NomsEtCourriels() {
System.err.println("[NomsEtCouriels]no argument constructor");
}
public NomsEtCourriels(Integer noLigne, String noms, String courriels) {
System.err.println("[NomsEtCouriels]3 field constructor : " + noLigne + ", noms=" + noms + ", courriels=" + courriels);
this.noLigne = noLigne;
this.noms = noms;
this.courriels = courriels;
}
+ getters / + setters
public String toString() {
return getNoLigne() + ":" + noms + " " + courriels;
}
当执行,我得到,因为两个fieds都返回空值的错误:
javax.persistence.PersistenceException: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
NOMSETCOURRIELS.NOLIGNE => null
NOMSETCOURRIELS.COURRIELS => <de****@hotmail.com>,
NOMSETCOURRIELS.NOMS => null)] during the execution of the query was detected to be null. Primary keys must not contain null.
Query: ResultSetMappingQuery(referenceClass=NomsEtCourriels )
如果我移动@Id注释到courriel
(电子邮件)字段,我没有得到任何错误,但输出显示相同的两个领域仍空即使DB程序确实返回值:
[MembresControleur]init this : org.labottedefoin.bfjsf.jpa.MembresControleur@1d84583b
[ejbMembresFacade]faireEnvoiCourriel envoiCourriel =StoredProcedureQueryImpl(ResultSetMappingQuery())
[EL Fine]: sql: 2015-03-10 22:42:46.171--ClientSession(955321153)--Connection(1494873499)--Thread(Thread[http-listener-2(1),5,main])--{ CALL envoi_courriel() }
[ejbMembresFacade]faireEnvoiCourriel envoiCourriel.execute() returned True.
[ejbMembresFacade]faireEnvoiCourriel courriel : null:null <de*****1@hotmail.com>,
[ejbMembresFacade]faireEnvoiCourriel courriel : null:null <au****@hotmail.fr>,
[ejbMembresFacade]faireEnvoiCourriel courriel : null:null <v****@b2b2c.ca>,
[ejbMembresFacade]faireEnvoiCourriel courriel : null:null <cha****@live.fr>,
[ejbMembresFacade]faireEnvoiCourriel courriel : null:null <si*****@b2b2c.ca>,
这里就是DB过程被称为实际的方法:
public List<NomsEtCourriels> faireEnvoiCourriel () {
List<NomsEtCourriels> courriels;
StoredProcedureQuery envoiCourriel = getEntityManager().createStoredProcedureQuery("envoi_courriel", NomsEtCourriels.class);
logger.info("[ejbMembresFacade]faireEnvoiCourriel envoiCourriel =" + envoiCourriel);
if (envoiCourriel.execute()) {
logger.info("[ejbMembresFacade]faireEnvoiCourriel envoiCourriel.execute() returned True.");
courriels = envoiCourriel.getResultList();
if (courriels != null) {// Iterate over the result set
for (NomsEtCourriels courriel : courriels) {
logger.info("[ejbMembresFacade]faireEnvoiCourriel courriel : " + courriel);
}
}
return courriels;
} else {
logger.info("[faireEnvoiCourriel] execute n'a renvoyé aucun result set");
return null;
}
}
任何想法,为什么行号和姓名字段不会在POJO设置是否正确?