2016-07-13 6 views
0

Ich habe folgende Einheiten:Hibernate

Person.java

@Table(name = persons) 
public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "UserID", nullable = false) 
    private Long userId; 

    @Column(name = "Employeenumber", nullable = false) private String employeeNumber; 
    @Column(name = "Firstname", nullable = false) private String firstName; 
    @Column(name = "Lastname", nullable = false) private String lastName; 

    public User() { } 

    public User(String employeeNumber, String firstName, String lastName) { 
     super(); 

     this.employeeNumber = employeeNumber; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    /* 
     getter and setters 

     ... 
    */ 

} 

Personhistory.java

@Entity 
@Table(name = personhistory) 
public class Personhistory { 

    @Id 
    @Column(name = "UserID", nullable = false) 
    private Long userId; 

    @Column(name = "Fromdate", nullable = false) private Date fromDate; 
    @Column(name = "Todate", nullable = false) private Date toDate; 
    @Column(name = "TeamID", nullable = false) private Integer teamId; 


    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "UnikId", nullable = false) 
    private Integer unikId; 

    public Userhistory() { 

    } 


    public Userhistory(Long userId, Date fromDate, Date toDate, int teamId) { 
     super(); 

     this.userId = userId; 
     this.fromDate = fromDate; 
     this.toDate = toDate; 
     this.teamId = teamId; 
    } 

    /* 
     Getters and setters 

     ... 
    */ 

} 

Team.java

@Entity 
@Table(name = "team") 
public class Team { 
    @Id 
    @Column(name = "TeamID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int teamId; 

    @Column(name = "TeamNumber") private String teamNumber; 

    public Team() {} 

    public Team(String teamNumber) { 
     super(); 
     this.teamNumber = teamNumber; 
    } 

    /* 
     Getters and setters 

     ... 
    */ 

} 

Ich möchte einen API-Aufruf wie folgt machen:

localhost:8080/users/{employee} 

Und ein Objekt zurück, welche die Person (His emp-Nummer, Vorname und Nachname), als er im Team war und welche Mannschaft das ist.

Wenn ich diese Abfrage in MSSQL schreiben, würde es so aussehen:

select * from persons p 

join personhistory ph on ph.UserID = p.UserID 
    and ph.Fromdate <= cast(getdate() as date) 
    and ph.Todate >= cast(getdate() as date) 
join team t on t.TeamID = ph.TeamID 

where u.Employeenumber = '999' 

ich für verschiedene Lösungen wie HQL um gesucht habe, JPQL, Kriterien und so weiter, aber ich bin nicht in der Lage zu Bring es zum Laufen.

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

AFAIK Hibernate 5.1 stellt allgemeinere Joins bereit, aber mit früheren Versionen mussten Sie entweder einen Cross-Join verwenden und die Bedingungen in der Where-Klausel hinzufügen oder eine echte Relation zwischen den Entitäten herstellen und diese Relation verbinden "with" Schlüsselwort für zusätzliche Join-Bedingungen.

Beispiel (beachten Sie, dass ich viele Anmerkungen der Einfachheit halber weggelassen):

class Person {  
    @OneToMany(mappedBy = "user") 
    Collection<Personhistory> history; 

    ... 
} 

class Personhistory { 
    @ManyToOne 
    Person user; 

    @ManyToOne 
    Team team; 

    ... 
} 

Dann wird die Abfrage

werden könnte
select p, ph, t from Person p 
    join p.history ph with ph.fromdate <= :date and ph.toDate >= :date 
    join ph.team t 
    where p.employeeNumber = :number 
+0

Dank - ich werde diese geben ein Go. –