hibernate subselect返回null

时间:2013-11-14 07:12:25

标签: spring hibernate hibernate-annotations

我在hibernate中使用subselect返回一个包含所有相关表而不是object的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,         pledger.id作为pledgerId,         di.ref_number为refNumber,         di.client_ref as clientRef,         日期为日期,         di.supplier_ref as supplierRef,         di.tons吨,         di.kg_per_bag为kgPerBag,         di.no_of_bags as noOfBags,         di.delivery_date as deliveryDate,         di.from_time fromTime,         di.to_time as time,         di.marking_on_bags作为markingOnBags,         di.origin_id为originId,         di.quality_id as qualityId,         di.remark作为评论,         di.status作为状态,         di.log作为日志         来自delivery_instruction di         在user.id = di.user_id上左加入用户         在client.id = di.client_id上加入company_master客户端         左边在controller.id = di.weight_controller_id上加入company_master控制器         在supplier.id = di.supplier_id上左加入company_master供应商         在grade.id = di.grade_id上​​左连接grade_master等级         在packing.id = di.packing_id上左连接packing_master包装         left join company_master qualityController on qualityController.id = di.quality_controller_id         在pledger.id = di.pledger上加入company_master pledger         仓库中的左连接仓库.id = di.warehouse_id 其中di.id = 21

1 个答案:

答案 0 :(得分: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;
}
相关问题