2010-10-18 18 views
7

Mam encję z osadzonym kluczem. Jednostka ma tylko klucz jako pole, a klucz ma 7 pól, z których niektóre mogą mieć wartość zerową.Lista pusta zwrócona z zapytania hibernacji z osadzonym identyfikatorem

Kiedy uruchomić następujące zapytanie:

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

uzyskać odpowiednią liczbę wyników, ale każdy wynik jest zerowy (czyli uzyskać listę obiektów zerowych 4000). Próbowałem używać zarówno kwerendy HQL i kryteria, ale oba dają ten sam wynik.

Klasy odwzorowań zostały wygenerowane z istniejącej bazy danych.

SQL generowane dla zapytania jest następujący

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=? 

Wygląda powinien wrócić poprawne dane.

plik odwzorowania jest bardzo proste (i generowany ze schematu.

// 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", [email protected](name="PROF_KEY", nullable=false, length=36)), 
    @AttributeOverride(name="profPropertyId", [email protected](name="PROF_PROPERTY_ID", nullable=false, length=64)), 
    @AttributeOverride(name="profExtKey", [email protected](name="PROF_EXT_KEY", length=256)), 
    @AttributeOverride(name="profName", [email protected](name="PROF_NAME", length=256)), 
    @AttributeOverride(name="profDataType", [email protected](name="PROF_DATA_TYPE", length=64)), 
    @AttributeOverride(name="profValue", [email protected](name="PROF_VALUE", length=1024)), 
    @AttributeOverride(name="profValueExtended", [email protected](name="PROF_VALUE_EXTENDED")) }) 
    public ProfileExtensionsId getId() { 
    return this.id; 
    } 

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

Jaki kod SQL jest generowany? Pokaż również swoje mapowanie i tabelę (w miarę możliwości). –

Odpowiedz

1

miałem ten sam problem nie jest wyjątkiem i listę null tej samej wielkości w wyniku kwerendy zacząłem zakomentowanie rzeczy i w porównaniu do innego JPA EmbeddedId. Oto, co odkryłem, wszystkie kolumny w EmbeddedId musi być non null dodać nullable = false do kolumn w @AttributeOverride i w id klasy @Embedded.Odtwórz kolumny null z klasy PK.

Nie wiem, dlaczego to działa, ale tak,

+0

Dla mnie pracowałem z rozwiązaniem zaproponowanym przez Randy P, ale dodałem atrybuty zerowalne do klasy NO PK z jej modułami pobierającymi i ustawiającymi. –

+0

czy możesz podać przykład Randy? proszę – joseaio

7

Ogólnie, prawdopodobnie nie jest dobrym pomysłem posiadanie zerowalnych kolumn jako części złożonego identyfikatora. W moim przypadku było to wymagane, ponieważ miałem widok utworzony przy użyciu sprzężenia zewnętrznego i miałem do czynienia z dokładnie tym samym problemem, który opisałeś. Udało mi się go rozwiązać, korzystając z informacji podanych na https://hibernate.onjira.com/browse/HHH-1109. Użyłem NullableStringType dostarczonego w załączniku do tej Hibernacji Jira. W mojej klasie kompozytowych id użyłem:

@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType") 
private String nullableField; 
+0

Atrybut zerowy, który opisałeś (https: // docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/type/NullableType.html) jest przestarzałe. – zionpi

+0

Dziękuję, to działa! – StefanTo

+2

link jest zepsuty :( – BlondCode

0

Jako „user405935”, powiedział, że nie jest to dobry pomysł, aby mieć zerowalne kolumn jako część klucza kompozytowego. Byłem w tej samej sytuacji co twoja, a problem polegał na tym, że wpisy z tabeli miały wartości NULL na kolumnach, które wzięły udział z mojego klucza złożonego, więc nie mogłem utworzyć mojego klucza osadzonego w czasie wykonywania.

Solutions: 1) czynią te kolumny nie wartości pustych lub 2) dodać nową kolumnę używany jako klucz podstawowy lub 3) znaleźć inny osadzony klucz używając tylko non-zerowalne kolumny

0

stoją problem bo masz włączone kolumn, które mogą mieć wartość zerową. Nie zawierają kolumn z możliwością zerowania w kluczu złożonym. Według definicji RDBMS klucz nie może mieć wartości null. Przemyśl kolumny, które mogą jednoznacznie identyfikować każdy wiersz i uczynić je częścią klucza złożonego.

Powiązane problemy