2015-11-30 8 views
-1

Прежде чем описать свою точную проблему, я покажу вам соответствующий код. У меня есть База данных, состоящая из двух объектов (PaymentProvider и Страна) и таблица соединений для реализации отношений Много-ко-многим.Неверный сгенерированный SQL-отчет с использованием JPA

CREATE TABLE paymentprovider (
    name VARCHAR(255) NOT NULL, 
    displayName VARCHAR(255) NOT NULL, 
    PRIMARY KEY(name) 
); 

CREATE TABLE country (
    code VARCHAR(255) NOT NULL, 
    name VARCHAR(255) NOT NULL, 
    PRIMARY KEY(code) 
); 

CREATE TABLE providercountry (
    paymentprovider_name VARCHAR(255) NOT NULL, 
    country_code VARCHAR(255) NOT NULL, 
    FOREIGN KEY(paymentprovider_name) REFERENCES paymentprovider(name), 
    FOREIGN KEY(country_code) REFERENCES country(code) 
); 

на языке Java реализация выглядит следующим образом (с помощью JPA):

Страна

@Entity 
@Table(name = "country") 
@NamedQueries({ 
    @NamedQuery(name = Country.GET_ALL, 
      query ="SELECT c FROM Country c") 
}) 
public class Country implements Serializable { 
    private static final long serialVersionUID = 0L; 

    private String code; 
    private String name; 
    private List<PaymentProvider> paymentProviders = new ArrayList<>(); 

    private static final String PREFIX = "foo.bar"; 
    public static final String GET_ALL = PREFIX + ".get_all"; 

    public Country(){ 
    } 

    @Id 
    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @ManyToMany(fetch = FetchType.EAGER, targetEntity=PaymentProvider.class) 
    @JoinTable(name = "providercountry", joinColumns = {@JoinColumn(name = "country_code", referencedColumnName = "code")}, inverseJoinColumns = { 
      @JoinColumn(name = "paymentprovider_name", referencedColumnName = "name")}) 
    public List<PaymentProvider> getPaymentProviders() { 
     return paymentProviders; 
    } 

    public void addPaymentProviders(PaymentProvider paymentProvider) { 
     this.paymentProviders.add(paymentProvider); 
    } 

    public void setPaymentProviders(List<PaymentProvider> paymentProviders) { 
     this.paymentProviders = paymentProviders; 
    } 

PaymentProvider:

@Entity 
@Table(name = "paymentprovider") 
public class PaymentProvider implements Serializable { 

    private static final long serialVersionUID = 1L; 


    private String name; 
    private String displayname; 
    private List<Country> countries = new ArrayList<>(); 

    public PaymentProvider(){ 
    } 

    @ManyToMany(mappedBy = "paymentProviders") 
    public List<Country> getCountries() { 
     return countries; 
    } 

    public void addCountry(Country country) { 
     this.countries.add(country); 
    } 

    public void setCountries(List<Country> countries) { 
     this.countries = countries; 
    } 

    public String getCode() { 
     return displayname; 
    } 

    public void setCode(String code) { 
     this.displayname = code; 
    } 

    @Id 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

И все, что я пытаюсь делать, это выполнить SQL-заявление так:

public List<Country> getAll() { 
    TypedQuery<Country> query = entityManager.createNamedQuery(Country.GET_ALL, Country.class); 
    return query.getResultList(); 
} 

Который оставляет меня с ошибкой:

причиненном: org.h2.jdbc.JdbcSQLException: Колонка "PAYMENTPRO1_.CODE" не найден;

Так что я пошел вперед и посмотрел на сгенерированный SQL:

select paymentpro0_.country_code as country_1_0_0_, 
     paymentpro0_.paymentprovider_name as paymentp2_2_0_, 
     paymentpro1_.name as name1_1_1_, 
     paymentpro1_.code as code2_1_1_ 
from providercountry paymentpro0_ inner join paymentprovider paymentpro1_ 
     on paymentpro0_.paymentprovider_name=paymentpro1_.name 
     where paymentpro0_.country_code=? 

Мне кажется, что - каким-то образом - Страна и PaymentProvider entites запутаться, потому что, как сгенерированный оператор SQL показывает, что вместо таблицы country-table есть соединение с таблицей paymentprovider-table. Любая идея, где я что-то смутил?

ответ

2

У вас есть желание получить связь PaymentProvider в Country. Запрос, который вы опубликовали, - это надежный выбор поставщика платежей для страны.

Это не так, потому что у вас нет кодового столбца у поставщика платежей, но у вас есть один в методе объекта PaymentProvider. Он отображает вашу сущность на основе метода, а не частной переменной displayName.

+0

Я столкнулся с этим около 100 раз. Спасибо за помощь... – Michael

Смежные вопросы