托管类型中不存在属性[]

时间:2016-06-13 00:47:23

标签: jpa

我正在做一个有这种关系的应用程序:个人联系人有一个电子邮件。

所以我试图从个人联系中找到电子邮件,我正在使用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]]。

我做了一些搜索,其他程序员说问题出在变量名称上......但我猜这些变量的名称是正确的。

那么我做错了什么?也许这两个班级之间的关系?

谢谢!

1 个答案:

答案 0 :(得分:4)

如果您仔细阅读了异常消息,您会发现它抱怨类SELECT t.*, SUM(t.matches) OVER () FROM newtable t; 没有名为Email的属性(属性),实际上,没有这样的属性。大概你的意思是personalContact属性?

(这样的错误是我建议通过Querydsl查询JPA的原因:代码完成可能会阻止这个错误,即使没有,你也会在尝试使用非错误时获得清晰的编译器消息现有财产)