Jpa Java持久性/JPQL中的分组依据

Jpa Java持久性/JPQL中的分组依据,jpa,jpql,Jpa,Jpql,我有一个实体类,它有@manytone关系。我需要在SQL查询中使用GROUPBY as。 我已经写了一个JPQL,但它不工作。我的代码是: @NamedQuery(name = "AssetDepModel.findByAssedId", query = "SELECT dep FROM AssetDepModel dep " + "JOIN dep.faDetails fad "

我有一个实体类,它有@manytone关系。我需要在SQL查询中使用GROUPBY as。 我已经写了一个JPQL,但它不工作。我的代码是:

    @NamedQuery(name = "AssetDepModel.findByAssedId", 
                query = "SELECT dep FROM AssetDepModel dep "
                        + "JOIN dep.faDetails fad "
                        + "WHERE fad.assetId.assId = :assetId_passed "
                        + "GROUP BY dep.faDetails,dep.faDetails.id,dep.fiscalModel.fyId,dep.depAmt,dep.depId,dep.depMethodId,dep.depRate,dep.depTypeId,dep.quarterId,dep.createdDt,dep.createdBy,dep.updatedDt,dep.updatedby "
                        + "ORDER BY fad.id")

public class AssetDepModel implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static final String FIND_BY_ASSET_ID = "AssetDepModel.findByAssedId";
    public static final String FIND_BY_DETAIL_ID = "AssetDepModel.findByDetailId";

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "dep_id")
    private int depId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fiscal_id", referencedColumnName = "fy_id")
    private FiscalYrModel fiscalModel;

    @Column(name = "quarter_id")
    private int quarterId;

    @ManyToOne
    @JoinColumn(referencedColumnName = "id", name = "fa_details_id")
    private FADetailsModel faDetails;

    @Column(name = "dep_type_id")
    private int depTypeId;

    @Column(name = "dep_method_id") 
    private int depMethodId;

    @Column(name = "dep_rate")
    private Double depRate;

    @Column(name = "dep_amt")
    private Double depAmt;

    @Column(name = "created_dt")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDt;

    @Column(name = "created_by")
    private int createdBy;

    @Column(name = "updated_dt")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedDt;

    @Column(name = "updated_by")
    private int updatedby;
我尝试了这段代码,但在调用JPQL时,它总是给出一个错误,即Select中的对象不包括在GROUPBY子句中。 我需要根据外键字段分组。 我发现以下错误:

Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Column
'inv_asset_depreciation.fa_details_id' is invalid in the select list because 
it is not contained in either an aggregate function or the GROUP BY clause.
Error Code: 8120
Call: SELECT t0.dep_id, t0.created_by, t0.created_dt, t0.dep_amt, t0.dep_method_id,
t0.dep_rate, t0.dep_type_id, t0.quarter_id, t0.updated_dt, t0.updated_by, 
t0.fa_details_id, t0.fiscal_id FROM inv_asset_depreciation t0, fiscal_yr t2,
inv_fixed_asset_detail_mcg t1 WHERE ((t1.asset_id = ?) AND ((t1.id = t0.fa_details_id)
AND (t2.fy_id = t0.fiscal_id))) GROUP BY t1.id, t1.asset_given_name,
t1.brand_name_description, t1.created_by, t1.created_date, 
t1.dispose_dt_en,t1.dispose_dt_np, t1.dispose_value, t1.req_form_no, 
t1.start_use_dt_en,t1.start_use_dt_np,t1.update_count, t1.updated_by, 
t1.updated_date, t1.asset_id,t1.dept_id, t1.status, t1.id,t2.fy_id, t0.dep_amt,
t0.dep_id, t0.dep_method_id,t0.dep_rate, t0.dep_type_id,t0.quarter_id, 
t0.created_dt, t0.created_by,t0.updated_dt, t0.updated_by 
ORDER BY t1.id
    bind => [1 parameter bound]
Query: ReportQuery(name="AssetDepModel.findByAssedId" referenceClass=AssetDepModel
sql="SELECT t0.dep_id, t0.created_by, t0.created_dt, t0.dep_amt,
t0.dep_method_id,t0.dep_rate,t0.dep_type_id, t0.quarter_id, t0.updated_dt,
t0.updated_by, t0.fa_details_id,t0.fiscal_id FROM inv_asset_depreciation t0,
fiscal_yr t2, inv_fixed_asset_detail_mcg t1 WHERE ((t1.asset_id = ?) 
AND ((t1.id = t0.fa_details_id) AND (t2.fy_id = t0.fiscal_id))) 
GROUP BY t1.id, t1.asset_given_name, t1.brand_name_description, 
t1.created_by,t1.created_date, t1.dispose_dt_en, t1.dispose_dt_np,
t1.dispose_value, t1.req_form_no, t1.start_use_dt_en, t1.start_use_dt_np,
t1.update_count, t1.updated_by, t1.updated_date,t1.asset_id, t1.dept_id,
t1.status, t1.id, t2.fy_id, t0.dep_amt, t0.dep_id, t0.dep_method_id,
t0.dep_rate, t0.dep_type_id, t0.quarter_id, t0.created_dt, 
t0.created_by, t0.updated_dt,t0.updated_by ORDER BY t1.id")
我修改了一点如下:

@SuppressWarnings("unchecked")
    public List<Object> findByAssetIdForSaleWriteOff(int assetId){
        Query query = getEntityManager().createQuery("SELECT fad.id,dep.depAmt FROM AssetDepModel dep "
                    + "JOIN dep.faDetails fad "
                    + "WHERE fad.assetId.assId = "+assetId+" "
                    + "GROUP BY fad.id,dep.depAmt "
                    + "ORDER BY fad.id",AssetDepModel.class);

        return (List<Object>)query.getResultList();
    }
List<Object> objList = assetDepEJB.findByAssetIdForSaleWriteOff(faObj.getAssId());
            Double amountDepTillNow = 0.0;
            int fadId = 0;
            int i=0;
            for (Iterator<Object> iterator3 = objList.iterator(); iterator3
                    .hasNext();) {
                Object[] obj = (Object[]) iterator3
                        .next();
                if (i>0) {
                    if (fadId != (Integer) obj[0]) {
                        break;
                    }
                }
                fadId = (Integer) obj[0];
                amountDepTillNow += (Double)obj[1];
                i++;

            }

它对我有效,但如果有其他有效的方法,请确实建议我。

添加group by中使用的所有列以进行选择,选择dep.fadetals、dep.fadetals.id、dep.fiscalModel.fyId、dep.depAmt、dep.depId、dep.dep.typeid、dep.quarterId、dep.createdDt、dep.createdBy、dep.updatedt、,你是说我必须添加外键对象包含的所有字段吗?它会很长,因为外键对象也有其他外键对象,它们也有其他等等。是的,你需要ot,为什么需要按这么多字段分组如果你不在你的select子句中使用任何聚合函数,如sum、count、avg、max等,则group by是无用的。。你想达到什么目标?举一个简单的具体例子,我只需要表中的两个列值,并且需要根据第一个所需的列进行分组。