Получить значения из базы данных в качестве пары ключей - PullRequest
1 голос
/ 08 марта 2019

У меня есть таблица, в которой я хотел бы хранить разные значения в виде ключей и значений:

@Entity
@Table(name = "wpf_payment_attributes")
public class WpfPaymentAttributes implements Serializable {

    private static final long serialVersionUID = -2629784870868584850L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 255)
    private String name;

    @Column(length = 255)
    private String global_ley;

    @Column(name = "VALUE", columnDefinition = "TEXT", length = 65535)
    private String value;
    ....
}

WpfPaymentAttributes attibutes = new WpfPaymentAttributes();
attibutes.setName("usage");
attibutes.setValue("Test Usage");
attibutes.setGlobal_key(12333);

WpfPaymentAttributes attibutes = new WpfPaymentAttributes();
attibutes.setName("name");
attibutes.setValue("Peter");
attibutes.setGlobal_key(12333);

Но как мне получить все значения с одним и тем же глобальным ключом одним SQL-запросом с использованием JPA? Проблема в том, что я заранее не знаю, каковы столбцы и значения таблицы.

Мне нужно получить эту структуру:

usage      | name
-------------------
Test Usage | Peter

Возможно ли это с JPA?

1 Ответ

1 голос
/ 08 марта 2019

Это невозможно, поскольку существуют некоторые проблемы, с которыми JPA не сможет вам помочь:

  • может быть несколько значений WpfPaymentAttributes с одинаковым глобальным ключом и именем (однако это может быть решено с помощью ограничения базы данных);
  • в столбце name могут быть произвольные значения, поэтому вам необходимо убедиться, что они действительно отображаются в ожидаемую структуру результатов, тамнет неизвестных «имен» и т. д.

Если вам не нужна супер-общая система, я бы посоветовал вам написать простой картограф, который не должен быть очень сложным.Просто получите все WpfPaymentAttributes по конкретному global_key и примените отображение.Например, вот структура, которая вам нужна:

public class Result {
    private String usage;
    private String name;
    // ...
}

А затем:

Result result = new Result();
List<WpfPaymentAttributes> attributes = entityManager.createQuery(
    // query should be parameterized
    "select a from WpfPaymentAttributes a where global_key = 12333" 
).getResultList();
for (WpfPaymentAttributes attribute : attributes) {
    String value = attribute.getValue();
    switch(attribute.getName()) {
        case "name":
            result.setName(value);
            break;
        case "usage":
            result.setUsage(value);
            break;
        default:
            throw new IllegalStateException();
    }
} 
return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...