Java Hibernate zapytanie MySQL

0

Witam, piszę w dalszym ciągu projekt MenadżerZadań, chciałbym się od Państwa dowiedzieć jak powinno wyglądać zapytanie MySQL wyciągające listę zadań przynależnych do jakiegoś Użytkownika mając taki schemat bazy danych:

user image

public class DostepTask implements Bdotwarcie {
	public List<Task> pobierzWszystkieTask() {
		try {
			if (!em.getTransaction().isActive()) {
				em.getTransaction().begin();
			}
			TypedQuery<Task> createQuery = em.createQuery(
					"select t from Task t", Task.class);
			List<Task> resultUserList = createQuery.getResultList();
			//System.out.println(resultUserList);

			em.getTransaction().commit();
			return resultUserList;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			em.getTransaction().rollback();
			return null;
		}
	}

}

 

Z góry dzięki za pomoc.

1

select * from zadania z join laczaca_u_z l on z.idzadania = l.idzadania where l.idUzytkownik = 5; ?

0

Wszystko prawie działa z tym pobieraniem taska usera, ale zrobiłem to inaczej trochę i mam gdzieś jakiś niewybaczalny błąd. Logując się na admina (id 1) wyświetla mi poprawnie zadanie w tabeli (idTask 1), lecz logując się już na Kierownika (id2) czy Usera (id 3) też wyświetla mi zadanie (idTask 1) nie wiem czemu. Proszę o pomoc, tona kodu pod spodem. Wybiorę tylko metody za to odpowiedzialne:

Metody główne:
public List<Long> pobierzTaskIdDlaUserId(long id) {

		List<Long> listIdOfTasks;
		try {
			if (!em.getTransaction().isActive()) {
				em.getTransaction().begin();
			}
			String sql = "select Task_IdTask from task_user where UsersList_idUser="
					+ id;
			Query q = em.createNativeQuery(sql);
			listIdOfTasks = q.getResultList();
			em.getTransaction().commit();
			return listIdOfTasks;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			em.getTransaction().rollback();
			return null;
		}
	}

	public Task pobierzTaskPoId(long id) {
		try {
			if (!em.getTransaction().isActive()) {
				em.getTransaction().begin();
			}
			Task task = em.find(Task.class, id);
			em.getTransaction().commit();
			return task;
		} catch (Exception ex) {
			em.getTransaction().rollback();
			return null;
		}

	}

	public LinkedList<Task> pobierzTaskDlaJednegoUsera(long idUser) {

		List<Long> list = this.pobierzTaskIdDlaUserId(idUser);
		LinkedList<Task> listOfTasks = new LinkedList<Task>();
		long zm=1;
		for (int i = 0; i < list.size(); i++) {
			
			listOfTasks.add(this.pobierzTaskPoId(zm));
			zm++;

		}
		return listOfTasks;
	}

}
 

i ładowanie danych do tabeli


	public void zaladujTaskDotabeli() {
		DostepTask dbTask = new DostepTask();

		System.out.println(LoginController.user.getIdUser()); //sprawdzałem i poprawnie pobiera idUsera z bazy, w konsoli wyświetla dobre.
		ObservableList<Task> listaTask = FXCollections
				.observableArrayList(dbTask.pobierzTaskDlaJednegoUsera(LoginController.user.getIdUser()));

		tv_task.setItems(listaTask);
	}

tabele z workbencha:

user image

0

mam takie yptanie - dlaczego nie korzystasz z @Transactional >?????? !!!!!11111

0

A jak masz zdefiniowane encje Task i User?
W mojej opinii powinieneś to rozwiązanie jeszcze raz przemyśleć i przebudować. (Ilu zapytań potrzebujesz, żeby pobrać zadania użytkownika? )

0

już Ci pokazuje:

TASK:

 package domain;

import java.sql.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
public class Task {
	public Task(){}
	@Id
	@GeneratedValue
	private long IdTask;
	@NotNull
	@Size(min = 3, max = 30)
	private String Title;
	@NotNull
	@Size(max = 255)
	private String Description;

	private java.sql.Date Deadline;

	private java.sql.Date startDate;
	@ManyToOne
	@JoinColumn(name = "idProject")
	private Project project;
	@ManyToMany
	private List<User> UsersList;

	/**
	 * @param idTask
	 * @param title
	 * @param description
	 * @param deadline
	 * @param startDate
	 * @param project
	 * @param usersList
	 */
	public Task(long idTask, String title, String description, Date deadline,
			Date startDate, Project project, List<User> usersList) {
		super();
		IdTask = idTask;
		Title = title;
		Description = description;
		Deadline = deadline;
		this.startDate = startDate;
		this.project = project;
		UsersList = usersList;
	}

	public long getIdTask() {
		return IdTask;
	}

	public void setIdTask(long idTask) {
		IdTask = idTask;
	}

	public String getTitle() {
		return Title;
	}

	public void setTitle(String title) {
		Title = title;
	}

	public String getDescription() {
		return Description;
	}

	public void setDescription(String description) {
		Description = description;
	}

	public java.sql.Date getDeadline() {
		return Deadline;
	}

	public void setDeadline(java.sql.Date deadline) {
		Deadline = deadline;
	}

	public java.sql.Date getStartDate() {
		return startDate;
	}

	public void setStartDate(java.sql.Date startDate) {
		this.startDate = startDate;
	}

	public Project getProject() {
		return project;
	}

	public void setProject(Project project) {
		this.project = project;
	}

	public List<User> getUsersList() {
		return UsersList;
	}

	public void setUsersList(List<User> usersList) {
		UsersList = usersList;
	}

}

USER:

package domain;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

@Entity
public class User {
	@Id
	@GeneratedValue
	private long idUser;
	@NotNull
	@Size(min = 3, max = 30)
	private String FirstName;
	@NotNull
	@Size(min = 3, max = 30)
	private String LastName;
	@NotNull
	@Size(min = 3, max = 30)
	@Column(unique = true)
	private String Login;
	@NotNull
	@Size(min = 3, max = 30)
	private String Password;
	@Email
	private String Email;
	@NotNull
	private String Permissions;
	@ManyToMany(mappedBy = "users")
	private List<Project> projects;

	public User() {
	};

	/**
	 * @param idUser
	 * @param firstName
	 * @param lastName
	 * @param login
	 * @param password
	 * @param email
	 * @param permissions
	 * @param projects
	 */
	public User(long idUser, String firstName, String lastName, String login,
			String password, String email, String permissions,
			List<Project> projects) {
		super();
		this.idUser = idUser;
		FirstName = firstName;
		LastName = lastName;
		Login = login;
		Password = password;
		Email = email;
		Permissions = permissions;
		this.projects = projects;
	}

	public long getIdUser() {
		return idUser;
	}

	public void setIdUser(long idUser) {
		this.idUser = idUser;
	}

	public String getFirstName() {
		return FirstName;
	}

	public void setFirstName(String firstName) {
		FirstName = firstName;
	}

	public String getLogin() {
		return Login;
	}

	public void setLogin(String login) {
		this.Login = login;
	}

	public String getPassword() {
		return Password;
	}

	public void setPassword(String password) {
		this.Password = password;
	}

	public String getEmail() {
		return Email;
	}

	public void setEmail(String email) {
		this.Email = email;
	}

	public String getPermissions() {
		return Permissions;
	}

	public void setPermissions(String permissions) {
		this.Permissions = permissions;
	}

	public String getLastName() {
		return LastName;
	}

	public void setLastName(String lastName) {
		LastName = lastName;
	}

	public List<Project> getProjects() {
		return projects;
	}

	public void setProjects(List<Project> projects) {
		this.projects = projects;
	}

}

 
0

Brakuje Ci mapowania relacji między task a user.
Poczytaj o @JoinTable

W swojej encji Task powinno być coś w stylu:

@ManyToMany
@JoinTable(
      name="task_user",
      joinColumns={@JoinColumn(name="UserList_IdUser", referencedColumnName="IdUser")},
      inverseJoinColumns={@JoinColumn(name="Task_IdTask", referencedColumnName="IdTask")}
)
private List<User> usersList;

Analogicznie, dodaj mapowanie relacji w encji User.

Wtedy uzyskasz dostęp do zadań użytkownika i użytkowników przypisanych do zadań:

user.getTasks();
task.getUserList();
0

Gitarra działa :P temat do zamknięcia :*

1 użytkowników online, w tym zalogowanych: 0, gości: 1