【问题标题】:org.hibernate.query.criteria.internal.BasicPathUsageException: Cannot join to attribute of basic typeorg.hibernate.query.criteria.internal.BasicPathUsageException:无法加入基本类型的属性
【发布时间】:2020-02-29 11:32:24
【问题描述】:

我的条件查询有问题。

在 MySQL 数据库中,有一个人列,它与列护照相连。 在标准 api 的帮助下,我试图通过对象/实体 Passport 的属性“国家”来获取对象/实体 Person。

我正在使用的代码示例:

public List<Guest> getByPassportCountry(String country) {
    try {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Guest> query = criteriaBuilder.createQuery(Guest.class);
        Root<Guest> root = query.from(Guest.class);
        Join<Guest, Passport> join = root.join(Guest_.PASSPORT).join(Passport_.COUNTRY);
        query.select(root).where(criteriaBuilder.equal(join.get(Passport_.COUNTRY), country));
        TypedQuery<Guest> result = entityManager.createQuery(query);
        return result.getResultList();
    } catch (NoResultException e) {
        return null;
    }
}

此外,这些实体之间存在联系: 实体护照

@Entity
@Table(name = "passport_table")
public class Passport extends AEntity{

    @Column(name = "passport_serial")
    private String passportSerial;

    @Column(name = "passport_number")
    private Integer passportNumber;

    @Column(name = "date_of_issue")
    @Convert(converter = StringToDataSQLConverter.class)
    private String dateOfIssue;

    @Column(name = "date_of_expiry")
    @Convert(converter = StringToDataSQLConverter.class)
    private String dateOfExpiry;

    @Column(name = "country")
    private String country;

    //One guest to one passport
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "guest_id", referencedColumnName = "id")
    private Guest guest;

&实体客人

@Entity
@Table(name = "guest_table")
public class Guest extends AEntity {

    @Column(name = "guest_first_name", length = 45)
    private String guestFirstName;

    @Column(name = "guest_last_name", length = 45)
    private String guestLastName;

    @Column(name = "guest_birthdate")
    @Convert(converter = StringToDataSQLConverter.class)
    private String guestBirthDate;

    //Many guests to one room
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "room_id", referencedColumnName = "id")
    private Room room;

    //One passport to one guest
    @OneToOne(mappedBy = "guest")
    private Passport passport;

我做错了什么??? 请帮忙!!!

【问题讨论】:

    标签: mysql criteria criteria-api


    【解决方案1】:

    我成功了

    public List<Guest> getByPassportCountry(String country) {
            try {
                CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
                CriteriaQuery<Guest> query = criteriaBuilder.createQuery(Guest.class);
                Root<Guest> root = query.from(Guest.class);
                Join<Guest, Passport> passport = root.join(Guest_.passport);
                query.select(root).where(criteriaBuilder.equal(passport.get(Passport_.COUNTRY),country));
                TypedQuery<Guest> result = entityManager.createQuery(query);
                return result.getResultList();
            } catch (NoResultException e) {
                return null;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 2018-07-12
      • 2013-09-27
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多