我正在尝试使用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。
编辑:我的映射:
MESSAGES:
@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中使用它,但是 有没有办法使用Criteria实现这一目标?
答案 0 :(得分:0)
try {
crit = session.createCriteria(Message.class, "msg");
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
// UPDATE
// Add your criteria sub query or any ...
}
并添加lazy='true'