我有这样的实体结构
@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 列表。
知道如何修复这个错误吗?
我认为没有简单的解决方案。除非您愿意将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: 我已经检查了实体类中的表名和列名,所有这些都是正确的,这是一个简单的映射,我也不涉及第二个表。
编辑:application.yml
我在elasticsearch(版本:5.1.1)中有一个现有的索引,其中有一些文档索引。索引中的映射(例如硬件)有一个A字段,如下所示: 我想用analyzer向其添加一个字段,如下所示:“BiosSerialNumber”:{“Type”:“Keyword”,“Fields”:{“Suffix”:{“Type”:“Text”,“analyzer”:“ABC_Analyzer”}}} “abc_