Нулевой список возвращается из запроса гибернации со встроенным идентификатором - PullRequest
9 голосов
/ 19 октября 2010

У меня есть объект со встроенным ключом. У сущности есть только ключ в качестве поля, а ключ имеет 7 полей, некоторые из которых могут быть нулевыми.

Когда я запускаю следующий запрос:

Criteria criteria = session.createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("id.profPropertyId", profileExtensionName));
Object obj = criteria.list();
log.info(obj);
return (List<ProfileExtensions>) obj; 

Я получаю правильное количество результатов, но каждый результат равен нулю (т.е. я получаю список из 4000 пустых объектов). Я пытался использовать как HQL-запрос, так и критерии, но оба они дают одинаковый результат.

Классы отображения были сгенерированы из существующей базы данных.

SQL, сгенерированный для запроса, выглядит следующим образом

select this_.PROF_DATA_TYPE as PROF1_14_0_, this_.PROF_EXT_KEY as PROF2_14_0_, 
       this_.PROF_KEY as PROF3_14_0_, this_.PROF_NAME as PROF4_14_0_, 
       this_.PROF_PROPERTY_ID as PROF5_14_0_, this_.PROF_VALUE as PROF6_14_0_, 
       this_.PROF_VALUE_EXTENDED as PROF7_14_0_ 
from EMPINST.PROFILE_EXTENSIONS this_ 
where this_.PROF_PROPERTY_ID=?

Похоже, он должен вернуть правильные данные.

Файл сопоставления довольно прост (и сгенерирован из схемы:

// Generated Oct 18, 2010 11:08:08 PM by Hibernate Tools 3.2.2.GA
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="PROFILE_EXTENSIONS"
    ,schema="EMPINST"
    , uniqueConstraints = @UniqueConstraint(columnNames={"PROF_KEY", "PROF_PROPERTY_ID"}) )
public class ProfileExtensions  implements java.io.Serializable {


 private ProfileExtensionsId id;

public ProfileExtensions() {
}

public ProfileExtensions(ProfileExtensionsId id) {
   this.id = id;
}

 @EmbeddedId

@AttributeOverrides( {
    @AttributeOverride(name="profKey", column=@Column(name="PROF_KEY", nullable=false, length=36) ), 
    @AttributeOverride(name="profPropertyId", column=@Column(name="PROF_PROPERTY_ID", nullable=false, length=64) ), 
    @AttributeOverride(name="profExtKey", column=@Column(name="PROF_EXT_KEY", length=256) ), 
    @AttributeOverride(name="profName", column=@Column(name="PROF_NAME", length=256) ), 
    @AttributeOverride(name="profDataType", column=@Column(name="PROF_DATA_TYPE", length=64) ), 
    @AttributeOverride(name="profValue", column=@Column(name="PROF_VALUE", length=1024) ), 
    @AttributeOverride(name="profValueExtended", column=@Column(name="PROF_VALUE_EXTENDED") ) } )
  public ProfileExtensionsId getId() {
    return this.id;
  }

  public void setId(ProfileExtensionsId id) {
      this.id = id;
  }
}

Ответы [ 4 ]

8 голосов
/ 18 марта 2012

В общем, не очень хорошая идея иметь обнуляемые столбцы как часть составного идентификатора.В моем случае это было необходимо, потому что у меня было представление, созданное с использованием внешнего соединения, и я столкнулся с точно такой же проблемой, как вы описали.Я смог решить ее, используя информацию, предоставленную https://hibernate.atlassian.net/browse/HHH-1109.. Я использовал NullableStringType, предоставленный во вложении к этому Hibernate Jira.В своем классе составных идентификаторов я использовал:

@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType")
private String nullableField;
1 голос
/ 30 сентября 2011

У меня была та же проблема без исключения и список нулей того же размера, что и результат запроса. Я начал комментировать материал и сравнивать его с другим EmbeddedId JPA. Вот что я обнаружил: все столбцы в EmbeddedId должны быть ненулевыми. Добавьте nullable = false в столбцы @AttributeOverride и в класс @Embedded id. Удалите пустые столбцы из класса PK.

Я не знаю, почему это работает, но это сработало.

0 голосов
/ 30 августа 2017

Вы столкнулись с проблемой, потому что вы включили столбцы, которые могут иметь нулевое значение.Не включайте обнуляемые столбцы в составной ключ.По определению СУБД ключ должен быть не нулевым.Пересмотрите столбцы, которые могут однозначно идентифицировать каждую строку и сделать их частью вашего составного ключа.

0 голосов
/ 13 ноября 2014

Как сказал user405935 , не рекомендуется создавать столбцы, допускающие обнуление, как часть вашего составного ключа.

Я находился в той же ситуации, что и ваша, и проблема заключалась в том, что записи из таблицы имели значения NULL в столбцах, которые были получены из моего составного ключа, поэтому он не мог создать мой встроенный ключ во время выполнения.

Решения:

  1. сделать эти столбцы необнуляемыми, или
  2. добавить новый столбец, используемый в качестве первичного ключа, или
  3. найти другой встроенный ключ, используя только необнуляемые столбцы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...