doublemc
doublemc

Reputation: 3311

Creating a JPQL query in CrudRepository

I'm trying to build a query that will return all the ToDoItems from passed User (want to pass logged in User) using JPQL.

Here is my stuff so far, don't know how to build it exactly:

public interface UserRepository extends CrudRepository<User, Long> {

   @Query(" from User u ")
   public Iterable<ToDoItem> findAllToDosForLoggedInUser(@Param("user") User user);

}

Here are my entities (omitted setters and getters): ToDoItem.java

@Entity
@Table (name = "TO_DO_ITEM")
public class ToDoItem extends BaseEntity {

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

   @Column(name = "COMPLETED")
   private boolean completed;

   @Column(name = "DUE_DATE", nullable = false)
   @Temporal(TemporalType.DATE)
   protected Calendar dueDate;

   // a ToDoItem is only associated with one user
   @ManyToOne(cascade=CascadeType.PERSIST)
   @JoinColumn(name = "USER_ID")
   private User user;


   // JPA demands empty contructor
   public ToDoItem() {}

   public ToDoItem(User user, String title, Calendar dueDate) {
      this.user = user;
      this.title = title;
      this.dueDate = dueDate;
   }
}

User.java

@Entity
@Table (name = "USERS")
public class User extends BaseEntity {

   @Column(name = "USERNAME")
   private String username;

   @Column(name = "PASSWORD")
   private String password;

   @Column(name = "EMAIL")
   private String email;

   // user can have many ToDoItems
   @OneToMany(cascade = CascadeType.ALL)
   private Set<ToDoItem> toDoItems;

   // JPA demands empty constructor
   public User() {}

   public User(String username, String password, String email) {
      this.username = username;
      this.password = password;
      this.email = email;
   }
}

Could someone also check if my entities are correct?

Upvotes: 1

Views: 956

Answers (1)

Maciej Kowalski
Maciej Kowalski

Reputation: 26572

You query should like :

@Query(" select td from User u inner join u.toDoItems td where u = :user")

In your User entity your mapping should have the mappedBy attribute:

@OneToMany(cascade = CascadeType.ALL, mappedBy="user")
private Set<ToDoItem> toDoItems;

Upvotes: 1

Related Questions