我正在做一个有这种关系的应用程序:个人联系人有一个电子邮件。
所以我试图从个人联系中找到电子邮件,我正在使用Criteria进行此查询,但始终返回IllegalArgumentException
:
@Override
public Email findByEmail(PersonalContact personalContact) {
CriteriaBuilder criteriaBuilder = entityManager().getCriteriaBuilder();
CriteriaQuery<Email> criteriaQuery = criteriaBuilder.createQuery(Email.class);
Root<Email> email = criteriaQuery.from(Email.class);
criteriaQuery.where(criteriaBuilder.equal(
email.get("personalContact"), criteriaBuilder.parameter(PersonalContact.class, "personalContact")));
TypedQuery<Email> typedQuery = entityManager().createQuery(criteriaQuery);
typedQuery.setParameter("personalContact", personalContact);
return typedQuery.getSingleResult();
}
个人联系就像一把外键。
这是我的电子邮件课程:
@Entity
@Table(name = "Email")
public class Email implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String mainEmail;
private List<String> secondaryMail;
@JoinColumn(name = "personal")
@OneToOne(fetch = FetchType.LAZY)
private PersonalContact pContact;
这是我的个人联系课程:
@Entity
@Table(name = "PERSONALCONTACT")
public class PersonalContact extends Contact implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PERSONAL_ID")
private Long id;
//Other variables
@OneToOne(fetch=FetchType.LAZY, mappedBy="personal")
private Email email;
每次执行查询时都会返回:
线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException:属性[personalContact]是 不存在于托管类型[EntityTypeImpl @ 1230307250:电子邮件[ javaType:class csheets.ext.crm.contact.Email描述符: RelationalDescriptor(csheets.ext.crm.contact.Email - &gt; [DatabaseTable(Email)]),映射:5]]。
我做了一些搜索,其他程序员说问题出在变量名称上......但我猜这些变量的名称是正确的。
那么我做错了什么?也许这两个班级之间的关系?
谢谢!
答案 0 :(得分:4)
如果您仔细阅读了异常消息,您会发现它抱怨类SELECT t.*, SUM(t.matches) OVER ()
FROM newtable t;
没有名为Email
的属性(属性),实际上,没有这样的属性。大概你的意思是personalContact
属性?
(这样的错误是我建议通过Querydsl查询JPA的原因:代码完成可能会阻止这个错误,即使没有,你也会在尝试使用非错误时获得清晰的编译器消息现有财产)