java - 无法解析属性 : userId. 用户名

标签 java hibernate criteria

我有以下实体类:

@MappedSuperclass
public class AbstractEntity implements Serializable, Comparable<AbstractEntity> {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    protected Integer id;

    @Override
    public int compareTo(AbstractEntity o) {
        return this.toString().compareTo(o.toString());
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

@Entity
@Table(name = "ticket")
@NamedQueries({
    @NamedQuery(name = "Ticket.findAll", query = "SELECT t FROM Ticket t")})
public class Ticket extends AbstractEntity {

    @Column(name = "title")
    private String title;
    @Column(name = "description")
    private String description;

    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private TicketStatus status;

    @Enumerated(EnumType.STRING)
    @Column(name = "priority")
    private TicketPriority priority;

    @Column(name = "categories")
    private String categories;
    @Column(name = "views")
    private Integer views;
    @Column(name = "date_time_created")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTimeCreated;

    @Column(name = "date_time_modified")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTimeModified;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "ticketId")
    private List<TicketFollower> ticketFollowerList;

    @JoinColumn(name = "project_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Project projectId;

    @JoinColumn(name = "ticket_attachment_id", referencedColumnName = "id")
    @ManyToOne
    private TicketAttachment ticketAttachmentId;

    @JoinColumn(name = "user_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private User userId;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "ticketId")
    private List<TicketComment> ticketCommentList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "ticketId")
    private List<TicketAttachment> ticketAttachmentList;

    @Inject
    public Ticket() {
    }


    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    ...

    @Override
    public String toString() {
        return getTitle();
    }

}

@Entity
@Table(name = "user")
@NamedQueries({
    @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")})
public class User extends AbstractEntity {

    @Enumerated(EnumType.STRING)
    @Column(name = "role")
    private Role role;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
    @Column(name = "avatar_path")
    private String avatarPath;
    @Column(name = "date_time_registered")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTimeRegistered;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<TicketFollower> ticketFollowerList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<Ticket> ticketList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<TicketComment> ticketCommentList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<ProjectFollower> projectFollowerList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<TicketAttachment> ticketAttachmentList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
    private List<Project> projectList;

    @Inject
    public User() {}

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

我从创建 hibernate Criteria 得到这个异常。在我的 TicketDao 类中,我有一个按用户名搜索票证的方法,当我调用下面的代码时

Criteria criteria = session.createCriteria(Ticket.class);
criteria.add(Restrictions.eq("userId.username", username));

它抛出异常:

could not resolve property: userId.username of: com.entities.Ticket

但是,当我编写如下标准时:

criteria.add(Restrictions.eq("userId.id", userId));

它没有显示任何异常并返回结果。知道为什么我的 criteria.add(Restrictions.eq("userId.username", username)); 和名字、姓氏等其他属性的语法是错误的吗?

最佳答案

Criteria 不像 ELJava 方法或属性那样工作,你不能引用内部对象一个点 .

您必须在 Ticket 中创建限制,对吗? Ticket 有什么? 用户。然后...您必须创建一个新的 User,将 username 设置为此 User 然后设置创建的 UserTicket 的条件:

Criteria criteria = session.createCriteria(Ticket.class);
User user = new User();
user.setUsername(username);
criteria.add(Restrictions.eq("user", user));

关于java - 无法解析属性 : userId. 用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870631/

相关文章:

java - 如何使 .NET 哈希表像 Java 哈希表一样工作

mysql - 让hibernate指向与DBUnit相同的DB连接

sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择

java - JPA 标准 API。使用带有参数的sql函数调用查询

java - 如何在 Hibernate 中使用列表关联获取对象

java - 将 String ArrayList 循环到 EditText 数组中的 setText

java - 如何阻止 Eclipse 卡在很长的自动完成列表上?

java - 从 spring Controller 返回 csv 文件时的奇怪行为

java - 如何使用 Spring 中的 @Transactional 保存实体

java - 如何使用注释和纯 Java 在 Spring 中设置 hibernate.hbm2ddl.auto