在Hibernate中若是經過 數據庫
session.createSQLQuery("select '合計' as name from dual").list()
session
查詢,返回值中只會有一個「合」字。 app
經查,常量在數據庫中被認爲是CHAR類型的,Hibernate取值時將其保存爲Character類型,而Character只能保存一個字符,因此形成返回值中只存在一個字符。Hibernate官方已存在此bug ,卻從未修復。 spa
該bug中給出2中解決方法: hibernate
1.繼承一個Dialect,並註冊CHAR類型的對應方式。代碼以下 orm
public class MySQLServerDialect extends org.hibernate.dialect.SQLServerDialect
{
public MySQLServerDialect()
{
super();
//very important, mapping char(n) to String
registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
}
}
對象
2.設置字段對應的類型(缺點是若是查詢不少字段,每一個字段都必須設置,沒設置類型的字段在結果集中是不存在的),代碼以下 繼承
session.createSQLQuery("select '合計' as name from dual").addScalar("name", Hibernate.STRING).list()
get
還有一種解決方法是在SQL中設置該字段的類型,代碼以下 it
session.createSQLQuery("select cast('合計' as varchar(4)) as name from dual").list()
該方法在Oracle和SQL Server中可用。
Hibernate中將SQL查詢出來字段轉換爲對象的方法有兩種
1.使用ResultTransformer,代碼以下
query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()
這種方法要求數據庫的字段名和類的屬性的大小寫必須一致,可是Oracle查詢返回的字段名卻全是大寫。
2.使用addEntity方法,這種方法的缺點是SQL必須寫成select * from users的形式或select {a.*},{b.*} from a,b where...的格式。