Ограничение Критерии гибернации для не загруженной таблицы - PullRequest
0 голосов
/ 15 июня 2011

Я пытаюсь получить запрос Criteria для ограничения на объект, который не загружен.

Все мои сопоставления выполняются через отношения один ко многим.

Например, я пытаюсь получить следующий запрос SQL с использованием критериев:

SELECT {msg.*} FROM Messages AS msg  
WHERE msg.source_key IN 
  ( SELECT ds.unique_key FROM Data_Sources AS ds " +
    WHERE ds.source_type_key IN " +
       ( SELECT dst.unique_key FROM Data_Source_types AS dst " +
          WHERE unique_name = 'RequiredName' ) )

Таким образом, я хочу получать сообщения с ограничением, установленным для объекта, который не выбирается Hibernate.В настоящее время лучшее, что я могу получить:

Criteria crit = session.createCriteria( Message.class )
    .createAlias( "dataSource", "ds", CriteriaSpecification.INNER_JOIN )
    .createAlias( "ds.sourceType", "type" )
    .add( Restrictions.eq( "type.name", "HL7GatewayServer" ) )

Однако этот запрос также загружает dataSource и dataSourceType.

РЕДАКТИРОВАТЬ: Мое сопоставление:

СООБЩЕНИЯ:

@Entity
@Table(name="messages", schema="mySchema") 
@SequenceGenerator(name="sequence",sequenceName="mySchema.local_key_sequence")
public class Message
{
    @Id
    @Column(name = "unique_key")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
    private long                     id;

    @JoinColumn(name = "source_key")
    @ManyToOne(targetEntity = DataSource.class, fetch = FetchType.LAZY)
    private DataSource               dataSource       = null;
    [...]
}

DATA_SOURCES:

@Entity
@Proxy(lazy = true)
@Table(name = "data_sources", schema = "mySchema")
@SequenceGenerator(name = "sequence", sequenceName = "mySchema.local_key_sequence")
public class DataSource
{
    @Id
    @Column(name = "unique_key")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
    private long                      id;

    @JoinColumn(name = "source_type_key")
    @ManyToOne(targetEntity = DataSourceType.class, fetch = FetchType.LAZY)
    private DataSourceType            sourceType;

    @OneToMany(targetEntity = Message.class, mappedBy = "dataSource", fetch = FetchType.LAZY)
    private Set<Message>             messages = new HashSet<Message>();

    [...]
}

DATA_SOURCE_TYPE:

@Entity
@Table(name="data_source_types", schema="mySchema") 
@SequenceGenerator(name="sequence",sequenceName="mySchema.local_key_sequence")
public class DataSourceType
{
    @Id
    @Column(name="unique_key", unique=true,nullable=false)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    private long id; 

    @OneToMany(targetEntity=DataSource.class, mappedBy="sourceType",fetch=FetchType.LAZY)
    private Set<DataSource> dataSources = new HashSet<DataSource>(0);

    [...]
}

Мне удалось заставить это работать в HQL, но есть ли способ добиться этого с помощью критериев?

1 Ответ

0 голосов
/ 17 июня 2011
try {

    crit = session.createCriteria(Message.class, "msg");
    crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    // UPDATE
    // Add your criteria sub query or any ...
}

и добавьте lazy='true'

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