0

我在休眠中使用子选择来返回一个包含所有相关表上的 id 而不是对象的对象。
这是我定义的 dto

@Entity
@Subselect("select di.id as id, user.id as userId, client.id as clientId, controller.id as controllerId,"
        + "supplier.id as supplierId, grade.id as gradeId, packing.id as packingId, warehouse.id as warehouseId,"
        + "qualityController.id as qualityControllerId,"
        + "companyMasterByPledger.id as pledgerId,"
        + "di.refNumber as refNumber,"
        + "di.clientRef as clientRef,"
        + "di.date as date,"
        + "di.supplierRef as supplierRef,"
        + "di.tons as tons,"
        + "di.kgPerBag as kgPerBag,"
        + "di.noOfBags as noOfBags,"
        + "di.deliveryDate as deliveryDate,"
        + "di.fromTime as fromTime,"
        + "di.toTime as toTime,"
        + "di.markingOnBags as markingOnBags,"
        + "di.originId as originId,"
        + "di.qualityId as qualityId,"
        + "di.remarks as remarks,"
        + "di.status as status,"
        + "di.log as log "
        + "from DeliveryInstruction as di "
        + "left join di.user as user "
        + "left join di.companyMasterByClientId as client "
        + "left join di.companyMasterByWeightControllerId as controller "
        + "left join di.companyMasterBySupplierId as supplier "
        + "left join di.gradeMaster as grade "
        + "left join di.packingMaster as packing "
        + "left join di.companyMasterByQualityControllerId as qualityController "
        + "left join di.companyMasterByPledger as pledger "
        + "left join di.warehouse as warehouse")
@Synchronize({"DeliveryInstruction"})
public class DeliveryView implements Serializable{

    private Integer id;
    private Integer userId;
    private Integer clientId;
    private Integer controllerId;
    private Integer supplierId;
    private Integer gradeId;
    private Integer packingId;
    private Integer warehouseId;
    private Integer qualityControllerId;
    private Integer pledgerId;
    private String refNumber;
    private String clientRef;
    private Date date;
    private String supplierRef;
    private Double tons;
    private Float kgPerBag;
    private Integer noOfBags;
    private Date deliveryDate;
    private String fromTime;
    private String toTime;
    private String markingOnBags;
    private Integer originId;
    private Integer qualityId;
    private String remark;
    private Byte status;
    private String log;

    public DeliveryView() {
    }

    public DeliveryView(Integer id, Integer userId, Integer clientId, Integer controllerId, Integer supplierId, Integer gradeId, Integer packingId, Integer warehouseId, Integer qualityControllerId, Integer pledgerId, String refNumber, String clientRef, Date date, String supplierRef, Double tons, Float kgPerBag, Integer noOfBags, Date deliveryDate, String fromTime, String toTime, String markingOnBags, Integer originId, Integer qualityId, String remark, Byte status, String log) {
        this.id = id;
        this.userId = userId;
        this.clientId = clientId;
        this.controllerId = controllerId;
        this.supplierId = supplierId;
        this.gradeId = gradeId;
        this.packingId = packingId;
        this.warehouseId = warehouseId;
        this.qualityControllerId = qualityControllerId;
        this.pledgerId = pledgerId;
        this.refNumber = refNumber;
        this.clientRef = clientRef;
        this.date = date;
        this.supplierRef = supplierRef;
        this.tons = tons;
        this.kgPerBag = kgPerBag;
        this.noOfBags = noOfBags;
        this.deliveryDate = deliveryDate;
        this.fromTime = fromTime;
        this.toTime = toTime;
        this.markingOnBags = markingOnBags;
        this.originId = originId;
        this.qualityId = qualityId;
        this.remark = remark;
        this.status = status;
        this.log = log;
    }

    @Id
    public Integer getId() {
        return id;
    }

    // ... others getter and setter

}

在 DAO 类中,该方法如下所示

public DeliveryView getDiById(int id) {
        return (DeliveryView) getHibernateTemplate().get(DeliveryView.class, id);
    }

但是,当我使用上述方法时,它返回 null。


当我运行该方法时,打印到控制台的脚本是

select deliveryvi0_.id as id36_0_, deliveryvi0_.clientId as clientId36_0_, deliveryvi0_.clientRef as clientRef36_0_, deliveryvi0_.controllerId as controll4_36_0_, deliveryvi0_.date as date36_0_, deliveryvi0_.deliveryDate as delivery6_36_0_, deliveryvi0_.fromTime as fromTime36_0_, deliveryvi0_.gradeId as gradeId36_0_, deliveryvi0_.kgPerBag as kgPerBag36_0_, deliveryvi0_.log as log36_0_, deliveryvi0_.markingOnBags as marking11_36_0_, deliveryvi0_.noOfBags as noOfBags36_0_, deliveryvi0_.originId as originId36_0_, deliveryvi0_.packingId as packingId36_0_, deliveryvi0_.pledgerId as pledgerId36_0_, deliveryvi0_.qualityControllerId as quality16_36_0_, deliveryvi0_.qualityId as qualityId36_0_, deliveryvi0_.refNumber as refNumber36_0_, deliveryvi0_.remark as remark36_0_, deliveryvi0_.status as status36_0_, deliveryvi0_.supplierId as supplierId36_0_, deliveryvi0_.supplierRef as supplie22_36_0_, deliveryvi0_.toTime as toTime36_0_, deliveryvi0_.tons as tons36_0_, deliveryvi0_.userId as userId36_0_, deliveryvi0_.warehouseId as warehou26_36_0_ from DeliveryView deliveryvi0_ where deliveryvi0_.id=?

它从 DeliveryView 表中获取不存在的数据,我想要的是从 DeliveryInstruction 表中获取数据。请帮我改正,谢谢

P / s:我正在使用spring和hibernate,我这样做是为了与jackson一起工作以防止它加载大量冗余信息(我使用了jackson hibernate模块,但它返回了很多不必要的信息,而不仅仅是id) . 所以如果你有更好的想法,请告诉我,谢谢。

  • 更新:我看到@subselect 上的脚本没有运行,当我调用“get(DeliveryView.class, id)”方法时,它执行默认脚本“select * from deliveryView”。
  • 更新:这是我检查过的本机脚本

    选择di.id作为id,user.id作为userId,client.id作为clientId,controller.id作为controllerId,supplier.id作为supplierId,grade.id作为gradeId,packing.id作为packingId,warehouse.id作为warehouseId,qualityController .id 作为 qualityControllerId,provider.id 作为承诺者 ID,di.ref_number 作为 refNumber,di.client_ref 作为 clientRef,di.date 作为日期,di.supplier_ref 作为供应商Ref,di.tons 作为吨,di.kg_per_bag 作为 kgPerBag,di.no_of_bags作为 noOfBags,di.delivery_date 作为deliveryDate,di.from_time 作为fromTime,di.to_time 作为toTime,di.marking_on_bags 作为markingOnBags,di.origin_id 作为originId,di.quality_id 作为qualityId,di.remark 作为备注,di.status 作为状态, 迪。从交付指令记录为日志 di 在 user.id 上左加入用户 = di.user_id 在 client.id 上左加入 company_master 客户端 = di.client_id 在 controller.id 上左加入 company_master 控制器 = di.weight_controller_id 在供应商.id 上左加入 company_master 供应商 = di.supplier_id 在grade.id = di.grade_id 上左加入grade_master 等级 在packing.id = di.packing_id 左加入company_master qualityController 在qualityController.id = di.quality_controller_id 上左加入company_master 质押者在provider.id = di 上。质押者离开加入仓库在warehouse.id = di.warehouse_id where di.id = 21client_id left join company_master controller on controller.id = di.weight_controller_id left join company_master supply on supplier.id = di.supplier_id left join grade_master grade on grade.id = di.grade_id left join packing_master packing on packing.id = di.packing_id left在 qualityController.id = di.quality_controller_id 上加入 company_master qualityController 离开在承诺者.id 上加入 company_master 质押者 = di.pledger 在warehouse.id 上离开加入仓库 = di.warehouse_id where di.id = 21client_id left join company_master controller on controller.id = di.weight_controller_id left join company_master supply on supplier.id = di.supplier_id left join grade_master grade on grade.id = di.grade_id left join packing_master packing on packing.id = di.packing_id left在 qualityController.id = di.quality_controller_id 上加入 company_master qualityController 离开在承诺者.id 上加入 company_master 质押者 = di.pledger 在warehouse.id 上离开加入仓库 = di.warehouse_id where di.id = 21packing_id 离开加入 company_master qualityController on qualityController.id = di.quality_controller_id 离开加入 company_master 质押者 on承诺者.id = di.pledger 离开加入仓库 on warehouse.id = di.warehouse_id where di.id = 21packing_id 离开加入 company_master qualityController on qualityController.id = di.quality_controller_id 离开加入 company_master 质押者 on承诺者.id = di.pledger 离开加入仓库 on warehouse.id = di.warehouse_id where di.id = 21

4

1 回答 1

0

1 创建简单的类(不带注释),其中包含您需要的所有属性,包括 getter 和 setter

2 执行原生sql:

public DeliveryView getDiById(int id) {
      DeliveryView dV = (DeliveryView) sessionFactory.getCurrentSession()
                .createSQLQuery(yourQueryHere).setResultTransformer(
                 new AliasToBeanResultTransformer(DeliveryView.class)).uniqueResult();  
      return dV;
}
于 2013-11-14T10:08:47.540 回答