小编Chr*_*ian的帖子

JPA OneToMany 列表没有找到应该继承的mappedBy 属性

我们目前正在处理一些要求,我们必须将一些类似的实体(汽车图片、宠物图片、假日图片等)添加到数据库中,这些实体都属于一个所有者(人)。我们不直接链接字节数组,而是使用引用。稍后可能会添加更多图片类型,以便降低复杂性,我们希望将其直接链接到 Java 类,以便我们可以使用instance of类似的东西。我们想使用@Inheritance一个PictureRef包含公共属性并链接到人的超类。然后还有另一个实体Person将包含这些子类的列表。这是OneToManymappedBy属性的关系。此mappedBy属性未知,因此 JPA 向我们返回此错误:

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown
target entity property:  de.company.project.somepackages.PictureRef.person 
in de.company.project.somepackages.Person.picturesOfCars
Run Code Online (Sandbox Code Playgroud)

我认为最好用下面的代码来说明。为了可读性,我删除了其他属性和 getter/setter 和 id 序列。

1) 所有 JPA 实体都源自一个抽象实体,该实体包含 id 和审计值。这可以正确地与其他子类一起使用,所以我认为这个类不会导致问题。

AbstractEntity

@MappedSuperclass
public abstract class AbstractEntity implements Serializable {
@Id
// Sequence definition removed
private Long id;
// other values are following //
}
Run Code Online (Sandbox Code Playgroud)

2)然后我们有一个必须包含公共属性的超类。所有派生类都必须写在一张表中(因为它们看起来非常相似)。此外,我们还将拥有直接与该实体一起使用的业务逻辑,例如通过 id 加载或删除。

PictureRef

@Entity
@Table(name = "t_picture_ref")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name …
Run Code Online (Sandbox Code Playgroud)

java inheritance hibernate jpa one-to-many

5
推荐指数
1
解决办法
4558
查看次数

JPA CriteriaBuilder 在集合中查找具有特定属性的元素的实体

我有一个包含元素列表的实体,现在我想搜索这些元素的属性。这个约束应该是“和”连接的。请看这些简单的例子:

@Entity
public class Parent {

    @Column
    @Enumerated(EnumType.STRING)
    private City city;

    @OneToMany(...)
    private List<Children> childrens;
}

@Entity
public class Children {

    @Column 
    @Enumerated(EnumType.STRING)
    private School school;

    @Column
    private Integer yearInSchool;

}    
Run Code Online (Sandbox Code Playgroud)

现在我想找到某个城市的父母,让我们说“BigCity”,学校“AwesomeSchool”的孩子在班级/6 年级。我只想通过 CriteriaBuilder 获得搜索结果。

到目前为止,我得到了:

final CriteriaBuilder c = getCriteriaBuilder();
final CriteriaQuery<Parent> query = c.createQuery(Parent.class);
final Root<Parent> r = query.from(Parent.class);
query.select(r)
        .where(c.and(c.equal(r.get("city"), City.BigCity)),
               c.equal(r.get("childrens").get("school"), School.AwesomeSchool),
               c.equal(r.get("childrens").get("yearInSchool"), 6));
Run Code Online (Sandbox Code Playgroud)

不幸的是,这里有两个问题: - 看起来我无法调用get("school")list 属性 - 这将返回所有有孩子的父母,这些孩子要么在“AwesomeSchool”,要么在学校上学 6 年。

你能帮我吗?我考虑过使用连接,但同样的问题是:如何定义连接的where部分,以便它认为必须同时满足两个属性(school 和 yearInSchool)。我发现了类似的帖子,关于查询其孩子满足一个条件的对象 - 但在这里孩子必须同时满足两个条件。

更新 1 如果我使用连接来断言例如一个孩子的“学校”,那么我对谓词的了解就到此为止:

Predicate predicate …
Run Code Online (Sandbox Code Playgroud)

collections entity-framework jpa predicates

2
推荐指数
1
解决办法
6254
查看次数