【问题标题】:hibernate.jpa.criteria.BasicPathUsageException: Cannot join to attribute of basic typehibernate.jpa.criteria.BasicPathUsageException:无法加入基本类型的属性
【发布时间】:2015-07-21 21:45:18
【问题描述】:

我有两张桌子:TaxTaxRule。两个表中有一列相同,即TAX_RULE_ID。但是没有像OneToOneOneToMany 这样的Hibernate 映射。两张表看起来都像-

税收

@Id
@Column(name = "TAX_RATE_ID")
private Long taxRateId;

@Column(name = "TAX_RULE_ID")
private Long taxRuleId;

@Column(name = "TAX_TYPE")
private String taxType;

TAX_RULE

@Id
@Column(name = "TAX_RULE_ID")
private Long taxRuleId;

@Column(name = "TAX_CD")
private String TaxCode;

@Column(name = "STATE")
private String state;

我正在尝试获取密钥上的数据,即TAX_RULE_ID。此列在两个表中都很常见。 我有以下Hibernate 代码,我在其中加入TAX_RULE_ID 列上的两个表,如下所示:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<String[]> cQuery =        criteriaBuilder.createQuery(String[].class);
Root<Tax> taxRoot = cQuery.from(Tax.class);

cQuery.multiselect(taxRateRoot.get("taxType"), taxRateRoot.get("taxRate"));
List<Predicate> predicates = new ArrayList<>();
Join<Tax, TaxRule> join = taxRoot.join("taxRuleId"); 
.....rest of the code.

我在连接点收到以下异常:

org.hibernate.jpa.criteria.BasicPathUsageException: Cannot join to attribute of basic type
at   org.hibernate.jpa.criteria.path.AbstractFromImpl.constructJoin(AbstractFromImpl.java:270)
at org.hibernate.jpa.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:263)
at org.hibernate.jpa.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:436)
at com.iclsystems.base.dao.TaxRateDAOImpl.getTaxTypeForApplicableWorkOrderTax(TaxRateDAOImpl.java:31)
at com.iclsystems.base.businessObjects.TaxLookupBOImpl.getTaxTypeForApplicableWorkOrderTax(TaxLookupBOImpl.java:53)
at com.iclsystems.base.businessObjects.TaxLookupBOImpl.getWorkOrderTaxLookup(TaxLookupBOImpl.java:29)
at com.iclsystems.test.eventhandler.base.TaxLookupBOTest.testTaxLookupBO(TaxLookupBOTest.java:52)

【问题讨论】:

  • 如消息所述,您不能加入非关系字段。 “taxRuleId”中没有关系。

标签: java oracle hibernate jpa hibernate-criteria


【解决方案1】:

您不能将@Join 注释用于基本属性(例如,具有简单@Column 映射的属性)。 @Join 用于关联:

  • 一对一
  • 一对多
  • 多对一
  • 多对多

您需要删除此行,因为 taxRuleId 已从数据库中获取:

Join<Tax, TaxRule> join = taxRoot.join("taxRuleId");

如果要加入 TaxRule 表,需要替换:

@Column(name = "TAX_RULE_ID")
private Long taxRuleId;

具有多对一关联:

@ManyToOne
@JoinColumn(name = "TAX_RULE_ID")
private TaxRule raxRule;

【讨论】:

  • 如果您无法通过添加多对一关联来更改 TAX 怎么办?可以加入吗?我只是问,因为我的实体已经修复了。
  • 是否可以从子表中过滤掉行,但以这种方式使用父表获取?
  • 如果您使用查询获取子实体,一切皆有可能。如果您在 join fetching 时尝试过滤集合,这是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2013-09-27
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多