【问题标题】:get max value of column using jpa criteria query使用 jpa 条件查询获取列的最大值
【发布时间】:2013-10-02 02:09:45
【问题描述】:

我想从表ElementRelationType 中获取列relationId 的最大值 我已经写了代码,但是它给出了错误

CriteriaBuilder cb1 = entityManager.getCriteriaBuilder();
CriteriaQuery<ElementRelationTypes> cq1 = cb1.createQuery(ElementRelationTypes.class);
Root<ElementRelationTypes> root = cq1.from(ElementRelationTypes.class);
cq1.select(cb1.max(root.get("relationId")));

select 和 max 都给出错误 如何获得整数最大值

public class ElementRelationTypes {

private RelationId relationLangPK=new RelationId(); 

private Country country;
private Status status;


@EmbeddedId
public RelationId getRelationLangPK() {
    return relationLangPK;
}
public void setRelationLangPK(RelationId relationLangPK) {
    this.relationLangPK = relationLangPK;
}

@Transient
public Integer getRelationId() {
    return getRelationLangPK().getRelationId();
}
public void setRelationId(Integer relationId) {
    getRelationLangPK().setRelationId(relationId);
}
@Transient
public Language getLanguage() {
    return getRelationLangPK().getLanguage();
}
public void setLanguageCode(Language language) {
    getRelationLangPK().setLanguage(language);
}

public class RelationId implements Serializable {
private static final long serialVersionUID = 1L;
private Integer relationId;
private Language language;

@JoinColumn(name=PersistenseConstants.ELEMENT_RELATION_TYPE_COL_RELATION_ID)
public Integer getRelationId() {
    return relationId;
}

public void setRelationId(Integer relationId) {
    this.relationId = relationId;
}

@OneToOne
@JoinColumn(name=PersistenseConstants.LANGUAGE_ENTITY_COL_LANG_CODE)
public Language getLanguage() {
    return language;
}

public void setLanguage(Language language) {
    this.language = language;
}

【问题讨论】:

  • 你到底得到了哪个错误?

标签: jpa criteria-api


【解决方案1】:

你没有发布你收到了哪些错误,所以我不得不猜测。

CriteriaBuilder.max 接受 Expression&lt;N&gt; 其中N extends Number

同时Root.get默认返回Path&lt;Object&gt;,不能转换为Expression&lt;Number&gt;

因此,要调用max,您需要为root.get 指定通用参数:

cq1.select(cb1.max(root.<Number>get("relationId")));

您可以在此处将Number 替换为relationId 的实际类型(LongBigInteger 等)

更新: @perissf addressed 您的代码的另一个问题。如果要选择最大值(数字),则应将 CriteriaQuery 声明为对 Number 的查询,而不是 ElementRelationTypes

【讨论】:

  • 它适用于非复合键,但在我的情况下,relationId 是复合键。我提供了我的班级信息
  • @perissf 对不起,我只是想提一下,您的回答突出了 另一个 有用的点。我不确定它如何更好,但它肯定是不同的。如果您认为您的答案值得接受,请联系 OP。无论如何,我已经对你的答案投了赞成票。
  • 没问题。刚刚收到新信息时删除了我的答案!
  • @Surya 不清楚这里错误的根本原因是什么。也许您应该考虑发布另一个问题。不要忘记包含究竟是什么不起作用、编译器错误(如果有)、异常消息和堆栈跟踪(如果有)
  • @perissf 不确定:public Integer getRelationId()。我相信它仍然是数字
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 2018-12-27
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2020-03-29
  • 2014-10-23
相关资源
最近更新 更多