2016-06-10 4 views
0

В проекте, в котором я работаю, мы имеем ejb с единицей непрерывности с несколькими сущностями, но в последнее время нам нужно обновить некоторые объекты с помощью сложного id (2 поля, формирующего этот id), и с этим изменение запроса не ведет себя так, как мы ожидаем. У нас есть этот объект, который соответствует промежуточной таблице с отношением много к одному с измененным одним из сущностей.Запрос JPA не возвращает ожидаемый набор результатов

publicic class BapeConvCateZonas implements Serializable { 

private static final long serialVersionUID = 1L; 
@Size(max = 1) 
@Column(name = "B_INTERINIDAD") 
private String bInterinidad; 
@Size(max = 1) 
@Column(name = "B_SUSTIT_LARGA") 
private String bSustitLarga; 
@Size(max = 1) 
@Column(name = "B_SUSTIT_CORTA") 
private String bSustitCorta; 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "C_CODIGO") 
private Long cCodigo; 
@JoinColumns({ 
    @JoinColumn(name = "C_COD_GSA", referencedColumnName = "C_COD_GSA", updatable=false,insertable=false), 
    @JoinColumn(name = "C_COD_CENTRO", referencedColumnName = "C_CODIGO", updatable=false,insertable=false)}) 

@ManyToOne 
private BapeCentrossanitarios bapeCentrossanitarios; 
@JoinColumns({ 
    @JoinColumn(name = "C_COD_CONV", referencedColumnName = "C_COD_CONV"), 
    @JoinColumn(name = "C_COD_CATE", referencedColumnName = "C_COD_CATE")}) 
@ManyToOne(optional = false) 
private BapeConvCateTopes bapeConvCateTopes; 
@JoinColumns({ 
    @JoinColumn(name = "C_COD_GSA", referencedColumnName = "C_COD_GSA", updatable=false,insertable=false), 
    @JoinColumn(name = "C_COD_CENTRO", referencedColumnName = "C_COD_CENTRO", updatable=false,insertable=false), 
    @JoinColumn(name = "C_COD_DEPTO", referencedColumnName = "C_CODIGO", updatable=false,insertable=false)}) 

@ManyToOne 
private BapeDeptSanitarios bapeDeptSanitarios; 
@JoinColumn(name = "C_COD_GSA", referencedColumnName = "C_CODIGO", updatable=false,insertable=false) 
@ManyToOne 
private BapeGerenciasaludarea cCodGsa; 

И лицо изменилось:

public class BapeCentrossanitarios implements Serializable { 

@OneToMany(mappedBy = "bapeCentrossanitarios") 
private List<BapeConvCateZonas> bapeConvCateZonasList; 

private static final long serialVersionUID = 1L; 
@EmbeddedId 
protected BapeCentrossanitariosPK bapeCentrossanitariosPK; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 150) 
@Column(name = "A_DESCRIPCION") 
private String aDescripcion; 
@JoinColumn(name = "C_COD_GSA", referencedColumnName = "C_CODIGO", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private BapeGerenciasaludarea bapeGerenciasaludarea; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bapeCentrossanitarios") 
private List<BapeDeptSanitarios> bapeDeptSanitariosList; 

Идентификатор в этой организации изменилось с:

@Id 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 4) 
@Column(name = "C_CODIGO") 
private String cCodigo; 

To:

@EmbeddedId 
protected BapeCentrossanitariosPK bapeCentrossanitariosPK; 

И:

@Embeddable 

общественного класса BapeCentrossanitariosPK реализует Serializable {

@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 4) 
@Column(name = "C_CODIGO") 
private String cCodigo; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 4) 
@Column(name = "C_COD_GSA") 
private String cCodGsa; 

И когда я выполнить этот запрос не возвращает ничего:

SQL: select u from BapeConvCateZonas u where u.bapeConvCateTopes.bapeConvCateTopesPK.cCodConv=:convocatoria and u.bapeConvCateTopes.bapeConvCateTopesPK.cCodCate=:categoria and u.bapeCentrossanitarios is null and u.bInterinidad='S' order by u.cCodGsa.cCodigo ASC; 

BapeConvCateTopes сущностей: BapeConvCateTopes общественного класса реализует Serializable {

@Column(name = "N_ANIO_FINALIZACION") 
    private Short nAnioFinalizacion; 
    @JoinTable(name = "BAPE_CONV_CATE_MERI_SUB", joinColumns = { 
     @JoinColumn(name = "C_COD_CONV", referencedColumnName = "C_COD_CONV"), 
     @JoinColumn(name = "C_COD_CATE", referencedColumnName = "C_COD_CATE")}, inverseJoinColumns = { 
     @JoinColumn(name = "C_COD_AREA", referencedColumnName = "C_COD_AREA"), 
     @JoinColumn(name = "C_COD_TIPO", referencedColumnName = "C_COD_TIPO"), 
     @JoinColumn(name = "C_COD_SUBTIPO", referencedColumnName = "C_CODIGO")}) 
    @ManyToMany 
    @OrderBy("bapeMeritosSubtiposPK.cCodArea ASC") 
    private List<BapeMeritosSubtipos> bapeMeritosSubtiposList; 

    @JoinTable(name = "BAPE_CONV_CATE_TITU_EXPE", joinColumns = { 
     @JoinColumn(name = "C_COD_CONV", referencedColumnName = "C_COD_CONV"), 
     @JoinColumn(name = "C_COD_CATE", referencedColumnName = "C_COD_CATE")}, inverseJoinColumns = { 
     @JoinColumn(name = "C_COD_TITU", referencedColumnName = "C_CODIGO")}) 
    @ManyToMany 
    private List<BapeTitulaExper> bapeTitulaExperCollection; 
    @JoinColumn(name = "C_COD_CONV", referencedColumnName = "C_CODIGO", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private BapeConvocatorias bapeConvocatorias; 
    @JoinColumn(name = "C_COD_CATE", referencedColumnName = "C_CODIGO", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private BapeCategorias bapeCategorias; 

    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected BapeConvCateTopesPK bapeConvCateTopesPK; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 1) 
    @Column(name = "B_ACTIVO") 
    private String bActivo; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 1) 
    @Column(name = "B_NOTIF_AUTOMATICA") 
    private String bNotifAutomatica; 
    // @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation 
    @Column(name = "TOPE") 
    private BigDecimal tope; 
    @OneToMany(cascade = CascadeType.REFRESH, mappedBy = "bapeConvCateTopes") 
    @OrderColumn(name="C_COD_GSA") 
    private List<BapeConvCateZonas> bapeConvCateZonasList; 

И BapeConvCateTopesPK:

@Embeddable 
public class BapeConvCateTopesPK implements Serializable { 

    @Basic(optional = false) 
    @NotNull 
    @Column(name = "C_COD_CONV") 
    private long cCodConv; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "C_COD_CATE") 
    private long cCodCate; 

Таблица имеет значения, которые удовлетворяют критериям. Основываясь на последнем изменении, это должно быть связано с отношением и сложным идентификатором, но я не перестаю понимать, что может быть. Изменить: добавлено немного больше информации об изменении идентификатора.

+0

Вы проверили сгенерированный SQL? – Thomas

+0

'... это должно быть что-то, связанное с отношениями и сложным id ...' - для начала вы могли бы подумать о том, чтобы определить определение этого сложного id. – Thomas

+0

Я проверил строку sql, но не выполнил jpa, как я могу проверить sql? Отредактировано с дополнительной информацией. – xacy

ответ

0

Хотя ваш идентификатор изменяет проблему, используемый JPQL неверен. В частности, «u.bapeCentrossanitarios is null» заставляет внутреннее соединение над таблицами. Поскольку внутреннее объединение фильтрует нулевые значения, это предложение никогда не может быть правдой, поэтому результаты не возвращаются.

Запрос должен использовать левое внешнее соединение над этим отношением. Что-то вроде:

"select u from BapeConvCateZonas u left outer join u.bapeCentrossanitarios bapeCentrossanitarios where u.bapeConvCateTopes.bapeConvCateTopesPK.cCodConv=:convocatoria and u.bapeConvCateTopes.bapeConvCateTopesPK.cCodCate=:categoria and bapeCentrossanitarios is null and u.bInterinidad='S' order by u.cCodGsa.cCodigo ASC" 

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

Причина, по которой она, возможно, сработала, состоит в том, что ваши изменения в составной PK, скорее всего, обходят оптимизацию EclipseLink, которая позволяет оценить «u.bapeCentrossanitarios - Null» без формирования соединения - он может просто проверить значение pk если оно было нулевым. С изменениями один или несколько внешних ключей могут быть или не быть нулевыми (они не контролируются отображением), поэтому он должен обязательно присоединиться к таблицам.

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