Sql jpql select在eclipselink中返回null
我有一个非常简单的语句,它困扰着我,即使记录保存在数据库中也会返回null 我有一个“管理员”和“剥削者”实体,继承“利用者”实体(英文xd用户),如下所示: =========================实体管理员===============Sql jpql select在eclipselink中返回null,sql,oracle,entity-framework,jpa,eclipselink,Sql,Oracle,Entity Framework,Jpa,Eclipselink,我有一个非常简单的语句,它困扰着我,即使记录保存在数据库中也会返回null 我有一个“管理员”和“剥削者”实体,继承“利用者”实体(英文xd用户),如下所示: =========================实体管理员=============== @Entity @DiscriminatorValue("A") @Table(name="ADMINISTRATEUR") public class Administrateur extends Utilisateur{ pub
@Entity
@DiscriminatorValue("A")
@Table(name="ADMINISTRATEUR")
public class Administrateur extends Utilisateur{
public Administrateur(){
}
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE_UTILISATEUR")
@Table(name="UTILISATEUR")
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="utilisateur_seq_gen")
@SequenceGenerator(name="utilisateur_seq_gen", sequenceName="UTILISATEUR_SEQ", allocationSize = 1, initialValue = 1)
protected Long id_utilisateur;
@Column(name="NOM")
protected String nom;
@Column(name="PRENOM")
protected String prenom;
@Column(name="LOGIN")
protected String login;
@Column(name="MOT_PASSE_UTILISATEUR")
protected String mot_passe_utilisateur;
@Column(name="EMAIL")
protected String email;
@Entity
@DiscriminatorValue("E")
@Table(name="EXPLOITANT")
public class Exploitant extends Utilisateur{
@Column(name="ROLE")
private String role;
public Exploitant(){
}
}
=========================实体利用率我们===============
@Entity
@DiscriminatorValue("A")
@Table(name="ADMINISTRATEUR")
public class Administrateur extends Utilisateur{
public Administrateur(){
}
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE_UTILISATEUR")
@Table(name="UTILISATEUR")
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="utilisateur_seq_gen")
@SequenceGenerator(name="utilisateur_seq_gen", sequenceName="UTILISATEUR_SEQ", allocationSize = 1, initialValue = 1)
protected Long id_utilisateur;
@Column(name="NOM")
protected String nom;
@Column(name="PRENOM")
protected String prenom;
@Column(name="LOGIN")
protected String login;
@Column(name="MOT_PASSE_UTILISATEUR")
protected String mot_passe_utilisateur;
@Column(name="EMAIL")
protected String email;
@Entity
@DiscriminatorValue("E")
@Table(name="EXPLOITANT")
public class Exploitant extends Utilisateur{
@Column(name="ROLE")
private String role;
public Exploitant(){
}
}
=========================实体爆炸===============
@Entity
@DiscriminatorValue("A")
@Table(name="ADMINISTRATEUR")
public class Administrateur extends Utilisateur{
public Administrateur(){
}
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE_UTILISATEUR")
@Table(name="UTILISATEUR")
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="utilisateur_seq_gen")
@SequenceGenerator(name="utilisateur_seq_gen", sequenceName="UTILISATEUR_SEQ", allocationSize = 1, initialValue = 1)
protected Long id_utilisateur;
@Column(name="NOM")
protected String nom;
@Column(name="PRENOM")
protected String prenom;
@Column(name="LOGIN")
protected String login;
@Column(name="MOT_PASSE_UTILISATEUR")
protected String mot_passe_utilisateur;
@Column(name="EMAIL")
protected String email;
@Entity
@DiscriminatorValue("E")
@Table(name="EXPLOITANT")
public class Exploitant extends Utilisateur{
@Column(name="ROLE")
private String role;
public Exploitant(){
}
}
我使用此请求检索用户:
public Utilisateur getUserTest(){
EntityManager em=new JPAContainerFactory().createEntityManagerForPersistenceUnit("addressbook");
em.getTransaction().begin();
TypedQuery<Utilisateur> query_user = em.createQuery("SELECT u FROM Utilisateur AS u WHERE u.id_utilisateur=1", Utilisateur.class);
em.getTransaction().commit();
return query_user.getSingleResult();
}
这是一个不起作用的简单请求,此请求也是如此:
public Utilisateur getUserFromMail(String email){
EntityManager em=new JPAContainerFactory().createEntityManagerForPersistenceUnit("addressbook");
em.getTransaction().begin();
TypedQuery<Utilisateur> query_user = em.createQuery("SELECT u FROM Utilisateur AS u WHERE u.email= :email", Utilisateur.class);
query_user.setParameter("email", email);
em.getTransaction().commit();
return query_user.getSingleResult();
}
它说getsingle result不会检索任何结果
在数据库中,我100%确信结果存在:
我想不出这个问题,有人能帮我找到一个中肯的答案吗
谢谢
编辑
我得到的日志显示以下错误:
Sauthentifier.java:150=参考:returnquery\u user.getSingleResult()代码>
=====
Creer_encaissement.java:332=参考final-usilizateur-us=saut.getUserTest()代码>
数据库中的请求将返回相应的结果。
我还得到了这个注销:
映射正常,代码正常。
缺少的是ADMINISTRATEUR
表中的id\u usilizateur==1的条目 此问题的常见原因:
您可能正在使用其他用户/架构检查数据库
从应用程序
您拥有构建实体所需的完整数据。在这种情况下,您的Utisulateur在“Utisulateur”和“Administrator”表中都应该有一行,Administrator表需要ID=1和Type=a。这两个表都必须存在Utisulateur实例
如果这不起作用,请尝试持久化一个Utisulateur,然后重新读取该实例。为什么您的查询从Utisulateur中选择u作为u
?是否有名为u
的字段?你的意思是u.*
?@Brian我相信jpql就是这样做的,你可以检查:或者:“as”是可选的,通常省略;“从用户中选择用户”也有效。您可以将EclipseLink设置为记录生成的SQL并发布它吗?看看怎么做。尝试直接在数据库中执行查询并查看结果。我认为不需要在事务中封装简单的select查询——只要它不是JTA数据源,查询就不需要事务,如果它是JTA数据源,就不能使用em.getTransaction().begin()启动查询;无论如何。@Chris我已经添加了注销,但我不知道为什么会返回null,因为我还有其他语法完全相同的查询,它们不会返回null。首先,我没有得到你的建议。我正在添加脚本中的记录:插入到Usilizateur值中(1,'Administrator','am_dehimi@esi.dz“,”admin“,”admin“,”Farid“,”Farid“);这不会插入到administrator表中。然后我添加了:在管理员(ID_usilizateur)中插入值(1);通过实体(java代码)插入更好(jpa处理约束和继承),而不是我必须手动添加到所有表中的sql。谢谢@Chris。例如,我怎样才能让administrator.nom知道“nom”是sql中utisulateur(administrator扩展了utisulateur)的一个属性。我是否必须通过身份证使用join?ThanksI认为您正在使用JPA,它允许您查询任何实体属性,并将为您处理SQL中的连接。如果使用本机SQL查询,是的,您必须自己处理到需要包含在select或where子句中的表的联接。不,不,我使用的是jpa,问题是我必须联接三到四个表,这很复杂,因为我有许多继承,我正在考虑为此创建一个视图。您认为带有表注释的视图会比jpql语句(类型化查询)更好吗?您是对的,记录在表usilizateur中,但不在表Administrateur中。谢谢你,伙计。