命名查询的sql语句的问题

本文探讨了在 Hibernate 中使用 SQLQuery 的常见问题及解决方案,包括如何正确构建 SQL 查询语句以避免异常,并确保数据能够被正确映射到 Java 对象。
import java.util.HashSet;
import java.util.Set;


public class Person {
    
private Long id;
    
private int age;
    
private String firstName;
    
private String lastName;
    
private Set events = new HashSet();
    
public Set getEvents() {
        
return events;
    }

    
public void setEvents(Set events) {
        
this.events = events;
    }

    
public int getAge() {
        
return age;
    }

    
public void setAge(Integer age) {
        
this.age = age;
    }

    
public String getFirstName() {
        
return firstName;
    }

    
public void setFirstName(String firstName) {
        
this.firstName = firstName;
    }

    
public Long getId() {
        
return id;
    }

    
public void setId(Long id) {
        
this.id = id;
    }

    
public String getLastName() {
        
return lastName;
    }

    
public void setLastName(String lastName) {
        
this.lastName = lastName;
    }

    
}
 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.namequery.bean">

    
<class name="Person" table="HI_PERSON">
        
<id name="id" column="PERSON_ID">
            
<generator class="native" />
        
</id>
        
<property name="age" type="java.lang.Integer" />
        
<property name="firstName" column="fName">

        
</property>
        
<property name="lastName" column="lName" />
        
<set name="events" table="PERSON_EVENT">
            
<key column="PERSON_ID"></key>
            
<many-to-many column="EVENT_ID"
                
class="com.namequery.bean.Event" />
        
</set>
    
</class>
    
<query name="persons">
        
<![CDATA[ 
from Person
 ]]
>
    
</query>
    
<sql-query name="mySqlQuery">
        
<return alias="p" class="Person" />    
        SELECT 
{p.*} FROM HI_PERSON p  WHERE p.age=22    
    
</sql-query>
</hibernate-mapping>
tx = session.beginTransaction();    
          
            List people 
= session.getNamedQuery("mySqlQuery").list();

 

 

问题是 本人开始写了

  <sql-query name="mySqlQuery">
        
<return alias="p" class="Person" />    
        SELECT 
FROM HI_PERSON p  WHERE p.age=22    
    
</sql-query>

报错误如下:

Hibernate: SELECT * FROM HI_PERSON p WHERE p.age=26
org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:
82)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:
70)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:
43)
    at org.hibernate.loader.Loader.doList(Loader.java:
1565)
    at org.hibernate.loader.Loader.list(Loader.java:
1545)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:
103)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:
1406)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:
151)
    at com.namequery.NameQueryTest.main(NameQueryTest.java:
30)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 PERSON1_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.getLong(Unknown Source)

若写成  <sql-query name="mySqlQuery">
        
<return alias="person" class="Person" />    
        SELECT {p.
FROM HI_PERSON p  WHERE p.age=22    
    
</sql-query>

 

Hibernate: SELECT {p.*} FROM HI_PERSON p WHERE p.age=26
org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:
59)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:
43)
    at org.hibernate.loader.Loader.doList(Loader.java:
1565)
    at org.hibernate.loader.Loader.list(Loader.java:
1545)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:
103)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:
1406)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:
151)
    at com.namequery.NameQueryTest.main(NameQueryTest.java:
30)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 
'.' 附近有语法错误。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source)

<sql-query name="mySqlQuery">
  <return alias="p" class="Person" />
  
  SELECT  p.AGE as {p.age} FROM HI_PERSON p WHERE p.age=26 
 </sql-query>

Hibernate: SELECT p.AGE as AGE5_0_ FROM HI_PERSON p WHERE p.age=26
org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:
82)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:
70)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:
43)
    at org.hibernate.loader.Loader.doList(Loader.java:
1565)
    at org.hibernate.loader.Loader.list(Loader.java:
1545)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:
103)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:
1406)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:
151)
    at com.namequery.NameQueryTest.main(NameQueryTest.java:
30)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 PERSON1_0_ 无效。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(Unknown Source)

 

只有改成

<sql-query name="mySqlQuery">
  <return alias="p" class="Person" />
  
  SELECT  {p.*} FROM HI_PERSON p WHERE p.age=26 
 </sql-query>

才正确。

听别人说

<sql-query name="mySqlQuery">
  <return alias="p" class="Person" />
  
  SELECT  p.AGE as {p.age} FROM HI_PERSON p WHERE p.age=26 
 </sql-query> 把所有的对应列写全了。也可以正确。

但本人没有去尝试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值