Spring数据jpa连接多个参数的查询

时间:2017-05-05 16:48:16

标签: java spring hibernate spring-data-jpa

您好我正在尝试使用spring jpa从MySql db中提取记录。

实体1

@Entity @Table(name = "sku_warehouse") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Document(indexName = "skuwarehouse") public class SkuWarehouse extends AbstractAuditingEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "avail_qty")
    private Integer availQty;

    @Column(name = "effective_date")
    private ZonedDateTime effectiveDate;

    @Column(name = "expiration_date")
    private ZonedDateTime expirationDate;

    @ManyToOne
    private SkuMaster skuMaster;

    @ManyToOne
    private Country country;

    @ManyToOne
    private Warehouse warehouse;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getAvailQty() {
        return availQty;
    }

    public SkuWarehouse availQty(Integer availQty) {
        this.availQty = availQty;
        return this;
    }

    public void setAvailQty(Integer availQty) {
        this.availQty = availQty;
    }

    public ZonedDateTime getEffectiveDate() {
        return effectiveDate;
    }

    public SkuWarehouse effectiveDate(ZonedDateTime effectiveDate) {
        this.effectiveDate = effectiveDate;
        return this;
    }

    public void setEffectiveDate(ZonedDateTime effectiveDate) {
        this.effectiveDate = effectiveDate;
    }

    public ZonedDateTime getExpirationDate() {
        return expirationDate;
    }

    public SkuWarehouse expirationDate(ZonedDateTime expirationDate) {
        this.expirationDate = expirationDate;
        return this;
    }

    public void setExpirationDate(ZonedDateTime expirationDate) {
        this.expirationDate = expirationDate;
    }

    public SkuMaster getSkuMaster() {
        return skuMaster;
    }

    public SkuWarehouse skuMaster(SkuMaster skuMaster) {
        this.skuMaster = skuMaster;
        return this;
    }

    public void setSkuMaster(SkuMaster skuMaster) {
        this.skuMaster = skuMaster;
    }

    public Country getCountry() {
        return country;
    }

    public SkuWarehouse country(Country country) {
        this.country = country;
        return this;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    public Warehouse getWarehouse() {
        return warehouse;
    }

    public SkuWarehouse warehouse(Warehouse warehouse) {
        this.warehouse = warehouse;
        return this;
    }

    public void setWarehouse(Warehouse warehouse) {
        this.warehouse = warehouse;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        SkuWarehouse skuWarehouse = (SkuWarehouse) o;
        if (skuWarehouse.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, skuWarehouse.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "SkuWarehouse{" +
            "id=" + id +
            ", availQty='" + availQty + "'" +
            ", effectiveDate='" + effectiveDate + "'" +
            ", expirationDate='" + expirationDate + "'" +
            '}';
    } }

实体2:

@Entity
@Table(name = "sku_master")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "skumaster")
public class SkuMaster extends AbstractAuditingEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "ordering_item")
    private String orderingItem;

    @NotNull
    @Column(name = "sku_number", nullable = false)
    private String skuNumber;

    @Column(name = "sku_description")
    private String skuDescription;

    @Column(name = "brand_name")
    private String brandName;

    @Column(name = "item_status")
    private String itemStatus;

    @Column(name = "item_weight")
    private Float itemWeight;

    @Column(name = "item_tax_cd")
    private String itemTaxCd;

    @Enumerated(EnumType.STRING)
    @Column(name = "vendor_ship_cd")
    private Flag vendorShipCd;

    @Column(name = "ltu_quantity")
    private String ltuQuantity;

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "sku_master_country",
               joinColumns = @JoinColumn(name="sku_masters_id", referencedColumnName="id"),
               inverseJoinColumns = @JoinColumn(name="countries_id", referencedColumnName="id"))
    private Set<Country> countries = new HashSet<>();

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "sku_master_warehouse",
               joinColumns = @JoinColumn(name="sku_masters_id", referencedColumnName="id"),
               inverseJoinColumns = @JoinColumn(name="warehouses_id", referencedColumnName="id"))
    private Set<Warehouse> warehouses = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getOrderingItem() {
        return orderingItem;
    }

    public SkuMaster orderingItem(String orderingItem) {
        this.orderingItem = orderingItem;
        return this;
    }

    public void setOrderingItem(String orderingItem) {
        this.orderingItem = orderingItem;
    }

    public String getSkuNumber() {
        return skuNumber;
    }

    public SkuMaster skuNumber(String skuNumber) {
        this.skuNumber = skuNumber;
        return this;
    }

    public void setSkuNumber(String skuNumber) {
        this.skuNumber = skuNumber;
    }

    public String getSkuDescription() {
        return skuDescription;
    }

    public SkuMaster skuDescription(String skuDescription) {
        this.skuDescription = skuDescription;
        return this;
    }

    public void setSkuDescription(String skuDescription) {
        this.skuDescription = skuDescription;
    }

    public String getBrandName() {
        return brandName;
    }

    public SkuMaster brandName(String brandName) {
        this.brandName = brandName;
        return this;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getItemStatus() {
        return itemStatus;
    }

    public SkuMaster itemStatus(String itemStatus) {
        this.itemStatus = itemStatus;
        return this;
    }

    public void setItemStatus(String itemStatus) {
        this.itemStatus = itemStatus;
    }

    public Float getItemWeight() {
        return itemWeight;
    }

    public SkuMaster itemWeight(Float itemWeight) {
        this.itemWeight = itemWeight;
        return this;
    }

    public void setItemWeight(Float itemWeight) {
        this.itemWeight = itemWeight;
    }

    public String getItemTaxCd() {
        return itemTaxCd;
    }

    public SkuMaster itemTaxCd(String itemTaxCd) {
        this.itemTaxCd = itemTaxCd;
        return this;
    }

    public void setItemTaxCd(String itemTaxCd) {
        this.itemTaxCd = itemTaxCd;
    }

    public Flag getVendorShipCd() {
        return vendorShipCd;
    }

    public SkuMaster vendorShipCd(Flag vendorShipCd) {
        this.vendorShipCd = vendorShipCd;
        return this;
    }

    public void setVendorShipCd(Flag vendorShipCd) {
        this.vendorShipCd = vendorShipCd;
    }

    public String getLtuQuantity() {
        return ltuQuantity;
    }

    public SkuMaster ltuQuantity(String ltuQuantity) {
        this.ltuQuantity = ltuQuantity;
        return this;
    }

    public void setLtuQuantity(String ltuQuantity) {
        this.ltuQuantity = ltuQuantity;
    }

    public Set<Country> getCountries() {
        return countries;
    }

    public SkuMaster countries(Set<Country> countries) {
        this.countries = countries;
        return this;
    }

    public SkuMaster addCountry(Country country) {
        this.countries.add(country);
        return this;
    }

    public SkuMaster removeCountry(Country country) {
        this.countries.remove(country);
        return this;
    }

    public void setCountries(Set<Country> countries) {
        this.countries = countries;
    }

    public Set<Warehouse> getWarehouses() {
        return warehouses;
    }

    public SkuMaster warehouses(Set<Warehouse> warehouses) {
        this.warehouses = warehouses;
        return this;
    }

    public SkuMaster addWarehouse(Warehouse warehouse) {
        this.warehouses.add(warehouse);
        return this;
    }

    public SkuMaster removeWarehouse(Warehouse warehouse) {
        this.warehouses.remove(warehouse);
        return this;
    }

    public void setWarehouses(Set<Warehouse> warehouses) {
        this.warehouses = warehouses;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        SkuMaster skuMaster = (SkuMaster) o;
        if (skuMaster.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, skuMaster.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "SkuMaster{" +
            "id=" + id +
            ", orderingItem='" + orderingItem + "'" +
            ", skuNumber='" + skuNumber + "'" +
            ", skuDescription='" + skuDescription + "'" +
            ", brandName='" + brandName + "'" +
            ", itemStatus='" + itemStatus + "'" +
            ", itemWeight='" + itemWeight + "'" +
            ", itemTaxCd='" + itemTaxCd + "'" +
            ", vendorShipCd='" + vendorShipCd + "'" +
            ", ltuQuantity='" + ltuQuantity + "'" +
            '}';
    }
}

拉取记录的方法

@Query("select sw from SkuWarehouse sw left join fetch Warehouse w where sw.warehouse = w.warehouseId AND w.warehouseId=:warehouseId AND sw.skuMaster=:skuMasterId")
SkuWarehouse findOneWithEagerRelationships(@Param("warehouseId") String warehouseId, @Param("skuMasterId") Long skuMasterId);

实际上SQL查询有效

select * from sku_warehouse sw 
join warehouse w  on (sw.warehouse_id = w.id)
where  w.warehouse_id='024'
 and sw.sku_master_id='1072'

错误记录

Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Long com.company.wmapis.domain.SkuMaster.id] by reflection for persistent property [com.company.wmapis.domain.SkuMaster#id] : 1454
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:224)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4647)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4358)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226)
    at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:462)
    at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
    at org.hibernate.loader.Loader.doQuery(Loader.java:932)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
    at org.hibernate.loader.Loader.doList(Loader.java:2615)
    at org.hibernate.loader.Loader.doList(Loader.java:2598)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
    at org.hibernate.loader.Loader.list(Loader.java:2425)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1459)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1426)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1398)
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1444)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:210)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    ... 167 common frames omitted
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.company.wmapis.domain.SkuMaster.id to java.lang.Long
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:67)
    ... 206 common frames omitted

Jpa查询有什么问题?我甚至试过传递SkuMaster对象而不是Long,但后来我得到了MySql查询异常。

1 个答案:

答案 0 :(得分:2)

在我更改了我的Jpa查询和方法后,它可以正常工作

@Query(value="SELECT * FROM sku_warehouse sw JOIN warehouse w ON (sw.warehouse_id = w.Id) WHERE w.warehouse_id=?1 AND sw.sku_master_id=?2", nativeQuery = true)
SkuWarehouse findOneWithEagerRelationships(String warehouseId, Long skuMasterId);