1

我还有另一个休眠问题。我正在尝试接收所有具有最新消息的项目。为此,我尝试获取所有消息,按项目 ID 对它们进行分组,并在更新的列上应用 max 函数。我的查询构建如下所示:

query.select(from).orderBy(builder.desc(from.get(Message_.UPDATED))).multiselect(from.get(Message_.ID),builder.max(from.get(Message_.UPDATED))).groupBy(from.get(Message_.PROJECT));

但我收到一个例外,

[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: de.ls5.wt2.Message]

它无法将结果转换回消息实体。我必须定义一个适当的构造函数吗?那将是非常不幸的,因为它包含其他实体,使得查询非常困难。并且使用上述查询加入所有具有 jointype 权限的消息不起作用,不支持 sicne jointype 权限。有什么建议如何获得具有上述查询结果的 id 的消息实体列表?

任何帮助都将不胜感激。

编辑:消息类:

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    private Date created;
    private Date updated;
    @OneToOne
    private User creator;
    @OneToOne
    private Project project;
    private String content;

    public Message() {

    }
    //getter and setter
   }
4

1 回答 1

2

由于您只选择了这两列:

.multiselect(
    from.get(Message_.ID),
    builder.max(from.get(Message_.UPDATED))
) 

您需要为查询结果创建一个由两部分组成的构造函数:

  • Message_.ID 的对象(长 id)
  • Message_.UPDATED 的对象(更新日期)

因此,要么创建一个包含这些字段的自定义对象,并使用所有 args 构造函数。这也称为投影。另一种更简单的方法是使用这两个参数在现有实体中创建一个构造函数。

public Message(long id, Date updated) {
     this.id = id;
     this.updated = updated;
}
于 2019-06-21T18:54:36.070 回答