从 Hibernate 5.x 迁移到 6.2,许多以前工作的东西现在都失败了

问题描述 投票:0回答:1

需要帮助解决我从 Hibernate 5.x 迁移到 6.2 后面临的问题。之前一直没有任何问题的代码现在失败了。这是查询失败的示例。

public List<MarketCommodityInfo> getMarketCommodityInfoForCommodities(Double longitude, Double latitude,
            Integer page) {

        return getEntityManager().createQuery(
                "SELECT new org.kisanag.model.mandi.MarketCommodityInfo (mci, earth_distance(ll_to_earth(m.latitude, m.longitude), ll_to_earth(:latitude, :longitude)) / :conversion AS distance) FROM MarketCommodityInfo mci JOIN mci.id.market m JOIN mci.id.commodity c WHERE earth_distance(ll_to_earth(m.latitude, m.longitude),ll_to_earth(:latitude, :longitude)) < :within * :conversion ORDER BY distance, mci.id.arrivalDate, c.name",
                MarketCommodityInfo.class)
                .setParameter("latitude", latitude)
                .setParameter("longitude", longitude)
                .setParameter("within", 200)
                .setParameter("conversion", 1000)
                .setMaxResults(pageSize)
                .setFirstResult(page * pageSize)
                .getResultList();

    }

因错误而失败

Caused by: java.lang.IllegalStateException: Could not determine appropriate instantiation strategy - no matching constructor found and one or more arguments did not define alias for bean-injection
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.resolveAssembler(DynamicInstantiationResultImpl.java:197)
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.createResultAssembler(DynamicInstantiationResultImpl.java:106)
        at org.hibernate.sql.results.jdbc.internal.StandardJdbcValuesMapping.resolveAssemblers(StandardJdbcValuesMapping.java:53)
        at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:78)
        at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:64)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:341)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93)
        at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:109)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:302)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:243)
        at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:521)
        at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367)
        at org.hibernate.query.sqm.internal.QuerySqmImpl.list(QuerySqmImpl.java:1084)
        at org.hibernate.query.Query.getResultList(Query.java:119)

我修改了查询并添加了商品信息

SELECT new org.kisanag.model.mandi.MarketCommodityInfo (mci AS *commodityInfo*, earth_distance(ll_to_earth(m.latitude, m.longitude), ll_to_earth(:latitude, :longitude)) / :conversion AS distance) FROM MarketCommodityInfo mci JOIN mci.id.market m JOIN mci.id.commodity c WHERE earth_distance(ll_to_earth(m.latitude, m.longitude),ll_to_earth(:latitude, :longitude)) < :within * :conversion ORDER BY distance, mci.id.arrivalDate, c.name

现在它因以下错误而失败

Caused by: org.hibernate.query.sqm.sql.internal.InstantiationException: Unable to determine dynamic instantiation injection strategy for org.kisanag.model.mandi.MarketCommodityInfo#commodityInfo
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationAssemblerInjectionImpl.lambda$new$0(DynamicInstantiationAssemblerInjectionImpl.java:82)
        at org.hibernate.internal.util.beans.BeanInfoHelper.visitBeanInfo(BeanInfoHelper.java:55)
        at org.hibernate.internal.util.beans.BeanInfoHelper.visitBeanInfo(BeanInfoHelper.java:48)
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationAssemblerInjectionImpl.<init>(DynamicInstantiationAssemblerInjectionImpl.java:35)
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.resolveAssembler(DynamicInstantiationResultImpl.java:208)
        at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.createResultAssembler(DynamicInstantiationResultImpl.java:106)
        at org.hibernate.sql.results.jdbc.internal.StandardJdbcValuesMapping.resolveAssemblers(StandardJdbcValuesMapping.java:53)
        at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:78)
        at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:64)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:341)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168)
        at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93)
        at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:109)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:302)
        at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:243)
        at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:521)
        at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367)
        at org.hibernate.query.sqm.internal.QuerySqmImpl.list(QuerySqmImpl.java:1084)
        at org.hibernate.query.Query.getResultList(Query.java:119)

这是我的课程 MarketCommodityInfo

import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Transient;

@Entity
public class MarketCommodityInfo {

    @EmbeddedId
    public MarketCommodityInfoKey id;

    public Double minPrice;
    public Double modalPrice;
    public Double maxPrice;
    public String unit;

    @Transient
    public Double distance;

    public MarketCommodityInfo() {
    }

    public MarketCommodityInfo(MarketCommodityInfo commodityInfo, Double distance) {
        this.id = commodityInfo.id;
        this.minPrice = commodityInfo.minPrice;
        this.modalPrice = commodityInfo.modalPrice;
        this.maxPrice = commodityInfo.maxPrice;
        this.unit = commodityInfo.unit;
        this.distance = distance;
    }
}

和钥匙

import java.io.Serializable;
import java.util.Date;

import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToOne;

@Embeddable
public class MarketCommodityInfoKey implements Serializable {

    public Date arrivalDate;

    @OneToOne
    public Commodity commodity;

    @OneToOne
    public Market market;

    public MarketCommodityInfoKey() {
    }

    public MarketCommodityInfoKey(Date arrivalDate, Commodity commodity, Market market) {
        this.arrivalDate = arrivalDate;
        this.commodity = commodity;
        this.market = market;
    }

    @Override
    public String toString() {
        return "MarketCommodityInfoKey [arrivalDate=" + arrivalDate + ", commodity=" + commodity + ", market="
                + market + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((arrivalDate == null) ? 0 : arrivalDate.hashCode());
        result = prime * result + ((commodity == null) ? 0 : commodity.hashCode());
        result = prime * result + ((market == null) ? 0 : market.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MarketCommodityInfoKey other = (MarketCommodityInfoKey) obj;
        if (arrivalDate == null) {
            if (other.arrivalDate != null)
                return false;
        } else if (!arrivalDate.equals(other.arrivalDate))
            return false;
        if (commodity == null) {
            if (other.commodity != null)
                return false;
        } else if (!commodity.equals(other.commodity))
            return false;
        if (market == null) {
            if (other.market != null)
                return false;
        } else if (!market.equals(other.market))
            return false;
        return true;
    }

}

请帮忙

hibernate dynamic orm quarkus instantiation
1个回答
0
投票

等等,你的

MarketCommodityInfo
类有一个只有两个参数的构造函数,但是你的 HQL 指定了 三个 参数。

你为什么期望它起作用?

刚开始,

MarketCommodityInfo
需要有一个包含三个参数的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.