2013-03-13 14 views
23

Javadocは言う:addScalarとは何ですか?

SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type) 

Declare a scalar query result 

私はexecuteScalarは、C#であるか知っているが、このスカラーとC#のスカラーは絶対に違うように見えます。

答えて

26

これは、問合せの結果がエンティティではなく個々の名前付き列のオブジェクトを戻すことを宣言しています。たとえば

createSQLQuery("SELECT COUNT(*) AS c FROM Users").addScalar("c").uniqueResult() 

Longを返します。複数のスカラーを指定した場合、結果はObjectの配列に戻ります。 executeScalarと似ていますが、名前付き列で動作し、複合結果を返すことができる点が異なります。

3

addScalarは、SQLクエリの特定のキーに対するreturnTypeの情報です。

例:

Query a = new SqlQuery("Select username as un from users where ..."); 
a.addScalar("un", String); 

あなたが結果を照会した場合、指定した場合、結果は文字列または他のタイプになります。

13

のResultSetMetaDataを使用してのオーバーヘッドを避けるために、または単に返されるもので、より明確にするために、1の(addScalarを使用することができます):

session.createSQLQuery("SELECT * FROM CATS") 
.addScalar("ID", Hibernate.LONG) 
.addScalar("NAME", Hibernate.STRING) 
.addScalar("BIRTHDATE", Hibernate.DATE) 

指定このクエリ:

the SQL query string 
the columns and types to return 

この意志Object配列を返しますが、ResultSetMetadataは使用しませんが、その代わりに基になる結果セットからID、NAME、BIRTHDATE列をそれぞれLong、StringおよびShortとして明示的に取得します。これは、クエリが*を使用していて、3つ以上の列を返すことができたとしても、これらの3つの列だけが返されることを意味します。

スカラーのすべてまたは一部のタイプ情報を省略することは可能です。

session.createSQLQuery("SELECT * FROM CATS") 
.addScalar("ID", Hibernate.LONG) 
.addScalar("NAME") 
.addScalar("BIRTHDATE") 

これは、以前のように、本質的に同じクエリであるが、今のResultSetMetaDataは、IDのタイプを明示的に指定されるNAMEとBIRTHDATEのタイプを決定するために使用されます。

thisからコピーしました。

+3

@IrfanNasim:これらのタイプフィールドは、最近のHibernateのバージョンでは廃止されているようです。チェックアウト[この回答](http://stackoverflow.com/a/10256646/1228324)。これで 'Hibernate.LONG'の代わりに' LongType.INSTANCE'を使うべきです。 – Michi

+0

@エヴァン私はselectScalar(columnName、type)をいくつかの列に対してのみ行うことができますが、selectクエリで '*'を指定して以来、クエリ結果にはすべてのフィールドが必要ですか?だから私の問題は、私のPostgreSQLでは、フィールドのデータ型は 'bigserial'で、Javaコードの' BigInteger'に変換されています。しかし、私のPOJOクラスはLongというフィールドを持っていましたので、 'LongScheme(...) 'を使って' Long'フィールドの型を指定しました。私は道を見つけることができません。何か案が ? – mantri

関連する問題