简体   繁体   English

休眠联接中的多对一联接

[英]Many-to-one in hibernate join

I want to make join between Entry entity and Project entity. 我想在Entry实体和Project实体之间建立连接。 My goal is to search entries by assigned project id. 我的目标是按分配的项目ID搜索条目。 I enter project id and i want to get all entries with this project assigned. 我输入项目ID,并希望获得分配了该项目的所有条目。

This is my method in DAO class 这是我在DAO类中的方法

@Override
    public PageWrapper<Entry> getListOfEntries(EntrySC sc) {
        public PageWrapper<Entry> getListOfEntries(EntrySC sc) {
    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Entry> cq = cb.createQuery(Entry.class);
    Root<Entry> entry = cq.from(Entry.class);
    //Join<Entry,Project> join = cq.from(Entry.class).join(Entry_.project);

    cq.select(entry);

    PageWrapper<Entry> results = new PageWrapper<>();
    results.setResults(em.createQuery(cq).getResultList());
    results.setRows(em.createQuery(cq).getResultList().size());

    return results;
    }

And this is my Entry entity and Project entity 这是我的Entry实体和Project实体

@Entity
@Table(name = "Entry")
@NamedQueries({
    @NamedQuery(name="Entry.findAll", query="SELECT e FROM Entry e ORDER BY e.date DESC"),
    @NamedQuery(name="Entry.findByID", query="SELECT e FROM Entry e WHERE e.id = :entryID"),
    @NamedQuery(name="Entry.findByUserID", query="SELECT e FROM Entry e WHERE e.user.id = :userID ORDER BY e.date DESC"),
    @NamedQuery(name="Entry.findByProjectID", query="SELECT e FROM Entry e WHERE e.project.id = :projectID")
})
public class Entry extends BaseEntityAudit {


    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "PROJECT_ID", nullable = false)
    @JsonIgnore
    private Project project;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "USER_ID", nullable = false)
    @JsonIgnore
    private User user;

    @Column(name = "COMMENT", nullable = true)
    private String comment;

    @Column(name = "HOURS", nullable = false)
    private BigDecimal hours;

    @Column(name = "DATE", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date date;


    public Entry(){}

    //setters and getters

}

@Entity
@Table(name="Project")
@NamedQueries({
    @NamedQuery(name="Project.findAll", query="SELECT p FROM Project p"),
    @NamedQuery(name="Project.findByID", query="SELECT p FROM Project p WHERE p.id = :projectID")
})
public class Project extends BaseEntityAudit {

    @Column(name="NAME", nullable=false)
    private String name;

    @Column(name="START_DATE", nullable=false)
    @Temporal(TemporalType.DATE)
    private Date startDate;

    @Column(name="DUE_DATE")
    @Temporal(TemporalType.DATE)
    private Date dueDate;

    @Column(name="COMMENT", nullable=true)
    private String comment;


    public Project(){

    }

    //setters and getters
}

The project class dont know about entries. 项目类不知道条目。 Maybe this is the problem? 也许这是问题所在?

/////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////

Edit: 编辑:

I created join base on documentation. 我基于文档创建了联接。 But its not clear to me. 但我不清楚。 Because if i uncomment this i will get null pointer exception. 因为如果我取消注释,我将得到空指针异常。 I also created metamodel class 我还创建了元模型类

@StaticMetamodel(Entry.class)
public class Entry_ {

    public static volatile SingularAttribute<Entry,Project> project;

    public static volatile SingularAttribute<Entry,User> user;

    public static volatile SingularAttribute<Entry, String> comment;

    public static volatile SingularAttribute<Entry,BigDecimal> hours;

    public static volatile SingularAttribute<Entry,Date> date;

}

Provided that you already defined the NamedQuery annotations, I suppose you intended to use them when querying. 假设您已经定义了NamedQuery批注,那么我想您打算在查询时使用它们。 Here you can find the examples you need. 在这里,您可以找到所需的示例。 Otherwise if you prefer to construct the query with CriteriaQuery you can adopt these examples. 否则,如果您希望使用CriteriaQuery构造查询,则可以采用以下示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM