首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

hibernate SQLQuery 查询有关问题

2012-12-17 
hibernate SQLQuery 查询问题初学hibernate,今天试着用SQLQuery去查询指定字段,可是总是报列名无效,请各位

hibernate SQLQuery 查询问题
初学hibernate,今天试着用SQLQuery去查询指定字段,可是总是报列名无效,请各位高手帮忙看下是什么问题。。。

以下是代码:


测试:
                String sql = "SELECT NAME as {per.name} from PERSON per";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("per", Person.class);
List<Person> persons = sqlQuery.list();

for (Person person : persons) {
System.err.println(person.getName());
}
Person类

@Entity
public class Person {

private Integer pno;
private String name;
private String email;
private Integer age;
private Date birthDate;
private String yourName;


@Transient
public String getYourName() {
return yourName;
}
public void setYourName(String yourName) {
this.yourName = yourName;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getPno() {
return pno;
}
public void setPno(Integer pno) {
this.pno = pno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}

@Temporal(TemporalType.DATE)
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
}

异常:
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2108)
at org.hibernate.loader.Loader.list(Loader.java:2103)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1696)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at org.alen.util.OperPerson.main(OperPerson.java:31)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 pno0_0_ 无效。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
at org.hibernate.type.IntegerType.get(IntegerType.java:28)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1097)


at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:565)
at org.hibernate.loader.Loader.doQuery(Loader.java:701)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2217)
... 7 more



[最优解释]
引用:
貌似这样还是有问题。。。。


看来只有用Transformers了、

这样、

String  sql = " select 表列名 as 实体属性 from 表 ";
createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(实体.class)).list();


除非你的表列和实体的属性一模一样  否则是肯定要写 列名 as 实体属性的

SELECT NAME AS name FROM  STUDENT

[其他解释]
session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)
[其他解释]
引用:
session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)


现在我就是要用原生态sql查询指定字段。。如果是原生态sql这个是什么原因呢?

继续求解。。
[其他解释]
引用:
session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)

+1
[其他解释]
  select  后面跟的是属性名   from  后面跟的是  类名   
好像是这样的吧
[其他解释]
看后台输出的SQL语句
[其他解释]
既然你使用jdbc,那么你就把你写的sql语句放在数据库中试试不就知道结果了吗

[其他解释]
引用:
引用:session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)

现在我就是要用原生态sql查询指定字段。。如果是原生态sql这个是什么原因呢?

继续求解。。



使用session.createSQLQuery(sql) 的话  
sql语句就是  普通的  select 字段 from 表 where 字段名=值
使用session.createQuery(hql)的话
hql语句要 使用对应的实体类
from 类 where 属性=值
[其他解释]
引用:
引用:引用:session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)

现在我就是要用原生态sql查询指定字段。。如果是原生态sql这个是什么原因呢……



不知道你的表结果和字段是什么 、

实体和表你应该知道是什么意思、

这样改下试试、

        String sql = "SELECT 表别名.字段  as {实体别名.属性} from 表 as  表别名";
        Query query = session.createSQLQuery(sql);
        query.addEntity("实体别名", 实体.class);
        query.list();



[其他解释]
引用:
引用:引用:引用:session.createSQLQuery(sql)
使用的是原生态语句查询、
而你写的是hql

你试试换成Query query = session.createQuery(hql)

现在我就是要用原生态sql查询指定……


首页谢谢你的耐心回答。非常感谢

我现在再把我的问题描述下,方便你更好理解。

现在我就是要实现下面这个例子相同的功能,不用List<Object[]> 来装, 需要用List<Student>装



Session session = new AnnotationConfiguration().configure().buildSessionFactory().openSession();

String hql = "select new Student(s.name) from Student s";

Query query = session.createQuery(hql);

List<Student> list = query.list();



以上是我用HQL实现的查询指定字段的实现,现在我就是不知道怎么用原生态的SQL查询指定指定字段的实现。

我的Student类 总共有两个属性 一个sno,一个name


[其他解释]
引用:
以上是我用HQL实现的查询指定字段的实现,现在我就是不知道怎么用原生态的SQL查询指定指定字段的实现。


这样可以嘛?
试试
//假设你的数据库表叫:  TN_STUDENT  里面的字段列名为:   CN_NAME

 String sql = "SELECT table.CN_NAME  as {s.name} from TN_STUDENT  as  table";
        Query query = session.createSQLQuery(sql);
        query.addEntity("s", Student.class);
        query.list();

[其他解释]
引用:
引用:以上是我用HQL实现的查询指定字段的实现,现在我就是不知道怎么用原生态的SQL查询指定指定字段的实现。

这样可以嘛?
试试
Java code?123456//假设你的数据库表叫:  TN_STUDENT  里面的字段列名为:   CN_NAME  String sql = "SELECT table.CN_N……


貌似这样还是有问题。。。。

我测试了下面的代码

STUDENT表  NAME表字段  Student类name类属性

String sql = "SELECT stu.NAME as {s.name} from STUDENT stu";

SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("s",Student.class);
List<Student> list = sqlQuery.list();

for (Student student : list) {
System.err.println(student.getName());
}

异常:
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2220)

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 id0_0_ 无效。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
at org.hibernate.type.IntegerType.get(IntegerType.java:28)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)





[其他解释]
你的sql有问题吧
{}占位符里是对象的属性,而非列名,并且必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。

[其他解释]
引用:
你的sql有问题吧
{}占位符里是对象的属性,而非列名,并且必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。


谢谢这位朋友。

这个如果是查询所有的话,的确是没有问题,但是如果我只想取其中几个字段是有点问题,但是这个貌似也是可以实现的。。。
[其他解释]
引用:
引用:貌似这样还是有问题。。。。

看来只有用Transformers了、

这样、

Java code?12String  sql = " select 表列名 as 实体属性 from 表 ";createSQLQuery(sql).setResultTransformer(Transformers.ali……


这种方法真的可行! 非常感谢你了。。。好了,可以结贴了。
[其他解释]
引用:
你的sql有问题吧
{}占位符里是对象的属性,而非列名,并且必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。


sd4000784 12楼的这种做法可行。。

热点排行