我有一个如下查询
select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id
Run Code Online (Sandbox Code Playgroud)
如果我可以使用HQL,我会使用HQL构造函数语法直接用结果集填充DTO.但是,由于hibernate不允许左连接而没有关联,我必须使用Native SQL Query.
目前,我循环遍历JDBC样式的结果集并填充DTO对象.有没有更简单的方法来实现它?
这是一个重要的补充,特别是在能够编写高效的动态HQL查询时解决性能问题.
但是,如果加载特定父项或另一个映射实体属性,我们如何修改HQL转换器?
以下代码:
session.createQuery(
"select st.stNumber as stNumber, st.stDate as stDate "
+ " from SomeTable st "
+ " where st.someTableId < 1000")
.setResultTransformer( Transformers.aliasToBean(database.SomeTable.class))
.list();
Run Code Online (Sandbox Code Playgroud)
工作正常,但如果我只想加载一些父母的属性怎么办?
例如,让我们说,SomeTable
有一个父母被叫SomedParent
,我想只访问这个父母的一个字段?
session.createQuery(
"select st.stNumber as stNumber, st.stDate as stDate, st.someParent.someParentField as someParentField "
+ " from SomeTable st "
+ " where st.someTableId < 1000")
.setResultTransformer( Transformers.aliasToBean(database.SomeTable.class))
.list();
Run Code Online (Sandbox Code Playgroud)
那么任何想法?
假设在一个实体中有属性id,用户名,年龄,地址.现在我只想要id和用户名,我使用这个代码.
预测允许从查询中返回除实体列表之外的其他内容.
var proj = Projections.ProjectionList()
.Add(Projections.Property("Id"), "Id")
.Add(Projections.Property("Username"), "Username");
var list2 = DetachedCriteria.For<User>()
.Add(Expression.Eq("Username", "lachlan"))
.GetExecutableCriteria( sessionFactory.GetCurrentSession())
.SetProjection( proj )
.List();
Run Code Online (Sandbox Code Playgroud)
我将如何检索值.在哪个对象中将采用这些值.
你好,我是 jpa + criteria API + hibernate 的新手。
我对 jpa 标准 API 中 ResultTransformer 的使用存有疑问。
我有两个实体“部门”和“员工”。部门和员工之间的一对多映射。我想使用带有 DTO 投影的实体图
1. 部门
@Entity
@NamedEntityGraph(name = "departmentWithEmployee", attributeNodes = @NamedAttributeNode("setOfEmployee"))
@Table(name = "tblDepartment")
public class Department {
@Id
private String id;
private String name;
@OneToMany(mappedBy = "department")
private Set<Employee> setOfEmployee;
//....getter & setter
}
Run Code Online (Sandbox Code Playgroud)
2. 员工
@Entity
@Table(name = "tblEmployee")
public class Employee {
@Id
private String id;
@ManyToOne
@JsonIgnore
private Department department;
private String firstName;
private String lastName;
//...getter & setter
} …
Run Code Online (Sandbox Code Playgroud) spring resulttransformer criteria-api spring-data-jpa entitygraph
我正在尝试使用nhibernate查询任意sql数据,只要我不使用Futures功能就可以正常工作,但是,当我使用Futures时,数据不会传递到ResultSetTransformer中.
示例代码:
public class TestResultSetTransformer : IResultTransformer
{
public object TransformTuple(object[] tuple, string[] aliases)
{
return tuple;
}
public IList TransformList(IList collection)
{
return collection;
}
}
public void Foo(ISession sess){
var x = sess.CreateSQLQuery("select * from MailEvent").SetResultTransformer(new TestResultSetTransformer()).Future<object[]>();
var xprime = sess.CreateSQLQuery("select * from MailEvent").SetResultTransformer(new TestResultSetTransformer()).List<object[]>();
foreach(var y in x)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,期货查询返回一个具有正确行数的空对象数组列表,当我调试它时,object []元组为空,但是对于列表查询,它按预期工作.
我有一对多关系所有者 - >狗.
我将通过ID查询狗以及以EAGER方式引入所有者我使用Hibernate 4.1.6设置此代码而不使用XML映射.我只需要来自DOG和OWNER的一些字段使用Projections Hibernate生成的SQL是完美的,但是我的对象没有填充,因为DOG返回填充的字段但是返回的所有者是 DOG.OWNER==NULL
我到目前为止使用的代码...我的entities.other
代码省略简洁
@Entity
public class Owner implements Serializable
{
Set<Dog>dogs=new HashSet<Dogs>(0);
@OneToMany(fetch=FetchType.LAZY, mappedBy="owner")
public Set<Dogs> getDogs(){return this.dogs}
}
@Entity
public class Dog implements Serializable
{
private Owner owner;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ownerid")
public Owner getOwner(){return this.owner;}
}
Run Code Online (Sandbox Code Playgroud)
这是我的方法.
public Dog getDogAndOwnerById(Integer dogId)
{
Projection p=Projections.projectionList()
.add(Projections.property("d.id"),"id")
.add(Projections.property("o.id"),"id");//and others fields
Session session = getHibernateTemplate().getSessionFactory().openSession();
Criteria like = session.createCriteria(Dog.class,"d")
.add(Restrictions.idEq(dogId)).setProjection(p)
.setResultTransformer(Transformers.aliasToBean(Dog.class))
.setFetchMode("owner",FetchMode.JOIN).createAlias("owner","o");
Dog dog = (Dog)like.uniqueResult();
//Object[]obj=(Object[])like.uniqueResult(); for(Object id:obj)System.out.println(id);
//System.out.println(obj.length);
session.close();
return dog;
//dog is OK …
Run Code Online (Sandbox Code Playgroud) java hibernate projection resulttransformer hibernate-criteria
hibernate ×3
java ×2
nhibernate ×2
projection ×2
criteria-api ×1
entitygraph ×1
hql ×1
native-sql ×1
orm ×1
spring ×1