H. *_*ang 5 criteria-api jpa-2.0
我有两个实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_Person")
@SequenceGenerator(name = "GEN_Person", sequenceName = "seq_person" , initialValue = 1, allocationSize = 10)
@Column(nullable = false)
private Long id;
private String familienname;
private String vorname;
...
}
Run Code Online (Sandbox Code Playgroud)
和子类:
@Entity
@DiscriminatorValue(value = "KIND")
public class Kind extends Person implements Serializable {
... // other properties
}
Run Code Online (Sandbox Code Playgroud)
我想通过jpa 2中的条件查询找到所有种类的实体。
我的查询:
public List<Kind> find(String f_name, String v_name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Kind> cq = cb.createQuery(Kind.class);
EntityType<Kind> type = em.getMetamodel().entity(Kind.class);
Root<Kind> kindRoot = cq.from(Kind.class);
// Constructing list of parameters
List<Predicate> predicates = new ArrayList<Predicate>();
if ((null != f_name) &&!f_name.isEmpty()) {
predicates.add(cb.like(cb.lower(kindRoot.get(type.getDeclaredSingularAttribute("familienname",
String.class))), "%" + f_name.toLowerCase() + "%"));
}
if ((null != v_name) &&!v_name.isEmpty()) {
predicates.add(cb.like(cb.lower(kindRoot.get(type.getDeclaredSingularAttribute("vorname",
String.class))), "%" + v_name.toLowerCase() + "%"));
}
cq.select(kindRoot).where(predicates.toArray(new Predicate[] {}));
return (List<Kind>) em.createQuery(cq).getResultList();
}
Run Code Online (Sandbox Code Playgroud)
但是我得到这样的错误:
javax.ejb.EJBException: EJB Exception: ; nested exception is:
java.lang.IllegalArgumentException: The declared attribute [familienname] from the managed type [EntityTypeImpl@441955560:Kind [ javaType: class com.itech_progress.kiwi.entities.Kind descriptor:
RelationalDescriptor(com.itech_progress.kiwi.entities.Kind --> [DatabaseTable(PERSON), DatabaseTable(KIND)]), mappings: 19]] is not present - however, it is declared on a superclass.;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我如何建立类型查询标准查询?
我建议生成规范元模型(链接是 Hibernate 文档,但是 JPA 的概念)。那么就Kind_.familienname可以直接在查询中使用,因为Kind_继承familienname自Person_.
如果这不是一个选项,则应通过超类的元模型引用超类的属性:
EntityType<Person> metamodelPerson = em.getMetamodel().entity(Person.class);
...
metamodelPerson.getDeclaredSingularAttribute("familienname", String.class)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |