当前位置: 首页 > 知识库问答 >
问题:

Hibernate未命中现有字段

臧弘和
2023-03-14

我有这样的实体结构

@MappedSuperclass
public abstract class Base {
    UUID id;
}

@MappedSuperclass
public abstract class Parent<C extends Child> extends Base {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<C> children;
}

@MappedSuperclass
public abstract class Child<P extends Parent> extends Base {
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private P parent;
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "ap")
public class AP extends Parent<AC> {}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "ac")
public class AC extends Child<AP> {}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "bp")
public class BP extends Parent<BC> {}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "bc")
public class BC extends Child<BP> {}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "cp")
public class CP extends Parent<CC> {}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "cc")
public class CC extends Child<CP> {
     String value;
}

执行条件查询

    CriteriaQuery<Long> cq = getEntityManager().getCriteriaBuilder().createQuery(Long.class);
    Root<CP> rt = cq.from(CP.class);
    Path child = rt.join("children");
    final CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    cq.select(criteriaBuilder.count(rt));
    cq.where(criteriaBuilder.equal(child.get("value"), "exists"));
    TypedQuery<Long> q = getEntityManager().createQuery(cq);
    Long res = q.getSingleResult()

并在where子句的行上获取错误:

java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [value] on this ManagedType [Base]

调试了一段时间后,我发现实体管理器的元模型中的父元类将属性子级保留为 AC 列表。

知道如何修复这个错误吗?

共有1个答案

冷涵忍
2023-03-14

我认为没有简单的解决方案。除非您愿意将value移动到AC并使CC扩展AC

此行为是因为类型擦除。

<code>子级</code>的实际泛型类型在运行时不可用,因为编译器将列表强制转换为泛型类型<code>列表

另请参阅这个很好的答案,它很好地向我解释了这件事。

查询后,可以检查列表/项目并将其转换为实际类型,但不确定在< code>CriteriaQuery中是否可行。

 类似资料:
  • 我得到这个例外: Java方法 public void getAllRevisions() {

  • 问题内容: 无论如何,我可以在现有的Elasticsearch映射中重命名元素而不必添加新元素?如果是这样,为了避免破坏现有映射,最好的方法是什么? 例如从fieldCamelcase到fieldCamelCase 问题答案: 您可以通过创建一个Ingest管道来做到这一点,该管道包含一个Rename Processor 和Reindex API 。 请注意,您需要运行Elasticsearch

  • 问题内容: 我需要帮助。 当我使用方法时,我在HQL中有错误: 我猜他一定要写代替 可能是我做错了实体和关系吗? 2个实体-房屋和街道 ER-model: Table Streets ID Name Houses_id Table Houses ID name My Classes: Street House My DAOIMP: StreetDAOImp: HouseDAOImpl: 错误: 问

  • 我正在编写一个spring boot+Hibernate JPA应用程序,我的Hibernate代码不工作,下面是详细信息 实体类: 服务/DAO: 我已经检查了实体类中的表名和列名,所有这些都是正确的,这是一个简单的映射,我也不涉及第二个表。

  • 我在elasticsearch(版本:5.1.1)中有一个现有的索引,其中有一些文档索引。索引中的映射(例如硬件)有一个A字段,如下所示: 我想用analyzer向其添加一个字段,如下所示:“BiosSerialNumber”:{“Type”:“Keyword”,“Fields”:{“Suffix”:{“Type”:“Text”,“analyzer”:“ABC_Analyzer”}}} “abc_