Я разрабатываю веб-приложение с спящим и весенним периодом. Я использую аннотацию для любой конфигурации.Запрос на спящий режим не возвращает правильные результаты
Моя проблема заключается в том, чтобы выбрать таблицу с двумя внешними ключами.
Объект, который содержит все есть:
@Entity
@Table(name = "WAR_PLAYERS_ATTACKS")
public class WarPlayerAttack implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "WAR_PLAYER")
private WarPlayer warPlayer;
@Id
@ManyToOne
@JoinColumn(name = "ATTACK")
private Attack attack;
@ManyToOne
@JoinColumn(name = "TYPE_ATTACK")
private TypeAttack typeAttackInWar;
public WarPlayerAttack() { }
// getters and setters
}
Entity warPlayer:
@Entity
@Table(name = "WAR_PLAYERS")
public class WarPlayer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", nullable = false)
private int id;
@ManyToOne
@JoinColumn(name = "WAR")
private War war;
@ManyToOne
@JoinColumn(name = "PLAYER")
private Player player;
@Column(name = "WAR_NUMBER")
private int warNumber;
@Column(name = "HAVE_KING")
private boolean haveKing;
@Column(name = "HAVE_QUEEN")
private boolean haveQueen;
@Column(name = "HAVE_POTIONS")
private boolean havePotions;
@OneToMany(mappedBy = "warPlayer", fetch = FetchType.EAGER)
private List<WarPlayerAttack> attacks;
public List<WarPlayerAttack> getAttacks() {
return attacks;
}
public void setAttacks(List<WarPlayerAttack> attacks) {
this.attacks = attacks;
}
private String comment;
public WarPlayer() {}
Мой DAO
@Override
public List<WarPlayerAttack> findByIdEnemyAndIdWar(int idEnemy, int idWar) throws DaoException {
List<WarPlayerAttack> attackss = null;
List attacks;
try {
attackss = getSession()
.createQuery("from WarPlayerAttack wpa where wpa.attack.enemy.id in :idEnemy and wpa.attack.enemy.war.id in :idWar")
.setParameter("idEnemy", idEnemy)
.setParameter("idWar", idWar)
//.createSQLQuery("select * from WAR_PLAYERS_ATTACKS where ATTACK in (select ID from ATTACKS where ENEMY in (select ID from WAR_ENEMIES where ID = ? and WAR = ?))")
//.setParameter(0, idEnemy)
//.setParameter(1, idWar)
.list();
} catch (Exception e) {
throw new DaoException(e.getMessage());
}
return attackss;
}
Моя проблема заключается в спящий режим не собирает warPlayer
. Соберите только Attack
и TypeAttack
. Пример данных, собранных в формате JSON (атака появляется, но не warPlayer):
[
{"attack":{"id":15,"enemy":{"id":10,"diffculty":0,"warNumber":2},"stars":1,"strategy":{"id":1,"value":"Air"},"timeRange":{"id":1,"value":"6H"}},"typeAttackInWar":{"id":3,"value":"Final 1"}},
{"attack":{"id":16,"enemy":{"id":10,"diffculty":0,"warNumber":2},"stars":2,"strategy":{"id":2,"value":"Ground"},"timeRange":{"id":3,"value":"18H"}},"typeAttackInWar":{"id":4,"value":"Final 2"}}
]
Если я делать с SQL дао вернуть мне Object[]
как [[1,1,1],[1,2,1]]
Столы для получения дополнительной информации:
CREATE TABLE WAR_ENEMIES (
ID INT AUTO_INCREMENT NOT NULL,
WAR INT NOT NULL,
WAR_NUMBER INT(2) NOT NULL,
DIFFCULTY INT(1),
CONSTRAINT PK_ENEMY PRIMARY KEY (ID),
CONSTRAINT FK_ENEMY_WAR FOREIGN KEY (WAR) REFERENCES WARS(ID)
);
CREATE TABLE ATTACKS (
ID INT AUTO_INCREMENT NOT NULL,
ENEMY INT,
STARS INT(1) DEFAULT 0,
STRATEGY INT,
TIME_RANGE INT,
CONSTRAINT PK_ATTACK PRIMARY KEY (ID),
CONSTRAINT FK_ATTACK_ENEMY FOREIGN KEY (ENEMY) REFERENCES WAR_ENEMIES(ID),
CONSTRAINT FK_ATTACK_STRATEGY FOREIGN KEY (STRATEGY) REFERENCES STRATEGIES(ID),
CONSTRAINT FK_ATTACK_TIME_RANGE FOREIGN KEY (TIME_RANGE) REFERENCES TIMES_RANGES(ID)
);
CREATE TABLE WAR_PLAYERS (
ID INT NOT NULL AUTO_INCREMENT,
WAR INT NOT NULL,
PLAYER INT NOT NULL,
WAR_NUMBER INT(2) NOT NULL,
HAVE_KING TINYINT(1) NOT NULL DEFAULT 1,
HAVE_QUEEN TINYINT(1) NOT NULL DEFAULT 1,
HAVE_POTIONS TINYINT(1) NOT NULL DEFAULT 1,
COMMENT VARCHAR(2500),
CONSTRAINT PK_PLAYER_IN_WAR PRIMARY KEY (ID),
CONSTRAINT FK_PLAYER_IN_WAR FOREIGN KEY (WAR) REFERENCES WARS(ID),
CONSTRAINT FK_PLAYER_IN_WAR_PLAYER FOREIGN KEY (PLAYER) REFERENCES PLAYERS(ID)
);
CREATE TABLE WAR_PLAYERS_ATTACKS (
WAR_PLAYER INT NOT NULL,
ATTACK INT NOT NULL,
TYPE_ATTACK INT NOT NULL,
CONSTRAINT PK_WAR_PLAYER_ATTACK PRIMARY KEY (WAR_PLAYER, ATTACK),
CONSTRAINT FK_WAR_PLAYER_ATTACK_WAR_PLAYER
FOREIGN KEY (WAR_PLAYER) REFERENCES WAR_PLAYERS(ID),
CONSTRAINT FK_WAR_PLAYER_ATTACK_ATTACK
FOREIGN KEY (ATTACK) REFERENCES ATTACKS(ID),
CONSTRAINT FK_WAR_PLAYER_ATTACK_TYPE
FOREIGN KEY (TYPE_ATTACK) REFERENCES TYPE_ATTACK(ID)
);
Я не знаю, что я делаю неправильно. (У меня мало времени с спящим)
Заранее благодарен.
Не могли бы вы пояснить, что в настоящее время не совсем понятно, что вы просите. Одно замечание - ваш «warPlayer» отмечен как ленивый. –
@ M.Deinum я отредактировал, чтобы поставить warPlayer после warPlayerAttack. – Arturo
Вы читали мой комментарий? ->. Одно замечание состоит в том, что ваш ** 'warPlayer' отмечен как ленивый **. –