JPA Присоединиться к таблицам Query - PullRequest
0 голосов
/ 10 марта 2019

Я работаю над школьным проектом, и у меня возникают проблемы с объединением таблиц, поэтому я могу отображать вывод в файле JSP с помощью JSTL. Я предоставлю весь необходимый код. Я знаю, что мне нужно как-то связать сущности, но я не знаю как.

SQL:

CREATE TABLE IF NOT EXISTS `totelegram`.`contacts` (
`id` INT NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`last_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`phone_number` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC),
UNIQUE INDEX `phone_number_UNIQUE` (`phone_number` ASC))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `totelegram`.`messages` (
`id_message` INT NOT NULL AUTO_INCREMENT,
`message` VARCHAR(2000) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT 
NULL,
`time` VARCHAR(45) NOT NULL,
`contacts_id` INT NOT NULL,
 PRIMARY KEY (`id_message`),
 UNIQUE INDEX `id_message_UNIQUE` (`id_message` ASC),
 INDEX `fk_messages_contacts_idx` (`contacts_id` ASC),
 CONSTRAINT `fk_messages_contacts`
 FOREIGN KEY (`contacts_id`)
 REFERENCES `totelegram`.`contacts` (`id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION)
 ENGINE = InnoDB;

Contacts.java

@Entity(name = "contacts")
public class Contacts implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@javax.persistence.Column(name = "first_name")
private String firstName;

@javax.persistence.Column(name = "last_name")
private String lastName;

@javax.persistence.Column(name = "phone_number")
private String phoneNumber;

...getters/setters, constructor, toString...

Messages.java

@Entity(name = "messages")
public class Messages implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@javax.persistence.Column(name = "id_message")
private int id;

private String message;

private String time;

@javax.persistence.Column(name = "contacts_id")
private int contactsId;

...getters/setters, constructor, toString...

MessagesRepository.java

public interface MessagesRepository extends JpaRepository<Messages, Integer> {

//custom query which will output this
//SELECT b.message, b.time, b.contacts_id, a.first_name, a.last_name FROM messages AS b INNER JOIN contacts as A ON (b.contacts_id=a.id) ORDER BY time ASC;
public List<Messages> findAll(); 

}

Надеюсь, мне было ясно. Спасибо всем заранее.

1 Ответ

0 голосов
/ 10 марта 2019

Насколько я понимаю, один контакт может иметь N сообщений, и вы не можете иметь сообщение без контакта, верно?

Поскольку у вас есть отношения между классами, вы должны использовать специальные аннотации в jpa, например:

в Message Class, вы должны использовать аннотацию @ManyToOne, так как у вас есть много сообщений для одного контакта. JoinColumn введет contacts_id в таблице сообщений.

@ManyToOne @JoinColumn(name = "contacts_id") private Contacts contact;

в классе Contacts , вы должны использовать аннотацию @OneToMany, так как One Contact имеет много сообщений. MappedBy делает ссылку на контакт в классе сообщений.

@OneToMany(mappedBy = "contact") private List<Messages> messages = new ArrayList<>();

Итак, вы сделали двунаправленную ссылку между контактами и сообщениями. Теперь в вашем классе обслуживания, я бы порекомендовал вам найти сообщения через контакты, так как вы не можете иметь сообщение без контакта. Это принцип репозитория.

Contacts con = repository.findOne(1); con.getMessages();

Кстати, извините за плохой английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...