Question

I'm using subselect in hibernate to return an object that contains id on all related table instead of object.
this the dto that I defined

@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

}

and in the DAO class, the method looks like below

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

However when I use the above method, it returned null.


When I run the method, the script that is printed to the console is

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=?

it gets the data from DeliveryView table which does not exist, what I want is to get the data from DeliveryInstruction table. Please help me to correct it, thanks

P/s: I'm using spring and hibernate and I do this way to work with jackson to prevent it load a lot of redundant information (I used jackson hibernate module, but it returned a lot of unneccessary information, instead of only id). So if you have any better idea, please tell me, thanks.

  • Update: I saw that the script on @subselect didn't run, it execute the default script "select * from deliveryView" when I call "get(DeliveryView.class, id)" method.
  • Update: This my native script that I've checked

    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, pledger.id as pledgerId, di.ref_number as refNumber, di.client_ref as clientRef, di.date as date, di.supplier_ref as supplierRef, di.tons as tons, di.kg_per_bag as kgPerBag, di.no_of_bags as noOfBags, di.delivery_date as deliveryDate, di.from_time as fromTime, di.to_time as toTime, di.marking_on_bags as markingOnBags, di.origin_id as originId, di.quality_id as qualityId, di.remark as remarks, di.status as status, di.log as log from delivery_instruction di left join user on user.id = di.user_id left join company_master client on client.id = di.client_id left join company_master controller on controller.id = di.weight_controller_id left join company_master supplier 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 join company_master qualityController on qualityController.id = di.quality_controller_id left join company_master pledger on pledger.id = di.pledger left join warehouse on warehouse.id = di.warehouse_id where di.id = 21

Was it helpful?

Solution

1 Create simple class(without annotations) that holds all properties you need with getters and setters

2 Execute native sql:

public DeliveryView getDiById(int id) {
      DeliveryView dV = (DeliveryView) sessionFactory.getCurrentSession()
                .createSQLQuery(yourQueryHere).setResultTransformer(
                 new AliasToBeanResultTransformer(DeliveryView.class)).uniqueResult();  
      return dV;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top