web-dev-qa-db-ja.com

addScalarは何をしますか?

JavaDocによると:

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

Declare a scalar query result

C#でexecuteScalarが何であるかは知っていますが、このスカラーとC#スカラーはまったく異なるようです。

29
superM

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

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

単一のLongを返します。複数のスカラーを指定すると、結果はObjectの配列として返されます。 executeScalarと似ていますが、名前付き列で機能し、複合結果を返すことができる点が異なります。

32
Zutty

ResultSetMetadataを使用するオーバーヘッドを回避するため、または単に返されるものをより明確にするために、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

これによりオブジェクト配列が返されますが、現在はResultSetMetadataを使用せず、ID、NAME、およびBIRTHDATE列をそれぞれ基になる結果セットからそれぞれLong、String、およびShortとして明示的に取得します。これはまた、クエリが*を使用しており、リストされている3つ以上の列を返す場合でも、これらの3つの列のみが返されることを意味します。

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

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

これは以前と基本的に同じクエリですが、現在ではResultSetMetaDataを使用して、NAMEとBIRTHDATEのタイプを判別しています。IDのタイプは明示的に指定されています。

this からコピー。

15
Evan

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

例:

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

結果を照会する場合、指定した場合、結果はストリングまたは他のタイプになります。

4
Grigor Nazaryan

これは、Beanに複数のdiffタイプのフィールドがあり、これらのフィールドをmysqlから同じタイプで取得する場合に使用されます。例えば。

public class Example { Long id; String name; }

次のようにスカラーを追加することができます

session.createSQLQuery("SELECT * FROM tableName")
.addScalar("id", Hibernate.LONG)
.addScalar("name", Hibernate.STRING);
0
Pravin J.