Как сопоставить результаты запросов использование SQL с помощью Ebean
Используя таблицы Postgres, созданные Ebean, я хотел бы запросить эти таблицы с помощью написанного от руки заявления:
SELECT r.name,
r.value,
p.name as param1,
a.name as att1,
p2.name as param2,
a2.name as att2
FROM compatibility c
JOIN attribute a ON c.att1_id = a.id
JOIN attribute a2 ON c.att2_id = a2.id
JOIN PARAMETER p ON a.parameter_id = p.id
JOIN PARAMETER p2 ON a2.parameter_id = p2.id
JOIN rating r ON c.rating_id = r.id
WHERE p.problem_id = %d
OR p2.problem_id = %d
Каждая из Соединенных таблиц представляет один из классов моей модели. Запрос выполняется нормально, но я не знаю, как я буду действовать:
Как я вообще могу выполнить запрос, используя Play 2.2. и Ebean? Как я могу сопоставить этот запрос с итерационным объектом? Нужно ли создавать класс модели, содержащий все поля запроса, или можно использовать какую-то хэш-карту? Как можно Я параметризую запрос безопасным способом?
1 ответ:
Для выполнения этого запроса необходимо использовать класс RawSql. Вы также должны будете создать класс, в который будут отлиты результаты.
Вот код примерного класса результатов:
import javax.persistence.Entity; import com.avaje.ebean.annotation.Sql; @Entity @Sql public class Result { String name; Integer value; String param1; String param2; String att1; String att2; }
И пример выполнения этого запроса:
String sql = " SELECT r.name," + " r.value," + " p.name as param1," + " a.name as att1," + " p2.name as param2," + " a2.name as att2" + " FROM compatibility c" + " JOIN attribute a ON c.att1_id = a.id" + " JOIN attribute a2 ON c.att2_id = a2.id" + " JOIN PARAMETER p ON a.parameter_id = p.id" + " JOIN PARAMETER p2 ON a2.parameter_id = p2.id" + " JOIN rating r ON c.rating_id = r.id" + " WHERE p.problem_id = %d" + " OR p2.problem_id = %d" RawSql rawSql = RawSqlBuilder .parse(sql) .columnMapping("r.name", "name") .columnMapping("r.value", "value") .create(); Query<Result> query = Ebean.find(Result.class); query.setRawSql(rawSql) .where().gt("amount", 10); List<Result> list = query.findList();