Что делает addScalar?

JavaDoc говорит:

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

Declare a scalar query result

Я знаю executeScalar находится в C#, но этот скаляр и скаляр C# кажутся абсолютно разными.

3 ответов


это объявление, что вы хотите, чтобы результат запроса возвращал объекты для отдельных именованных столбцов, а не сущности. Например,

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

вернет Long. Если вы укажете несколько скаляров, результат вернется в виде массива Object. Его похожие на executeScalar за исключением того, что он работает на именованных столбцов, и может возвращать составные результата.


чтобы избежать накладных расходов на использование 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 из базового набора результатов. Это также означает, что будут возвращены только эти три столбца, даже хотя запрос использует * и может возвращать больше, чем три перечисленных столбца.

можно оставить информацию о типе для всех или некоторых скаляров.

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

это по существу тот же запрос, что и раньше, но теперь ResultSetMetaData используется для определения типа имени и даты рождения, где в качестве типа ID явно указан.

скопировал из этой.


addScalar - это информация returnType для данного ключа в SQL-запросе.

пример:

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

Если вы запросите результат, результатом будет строка или другие типы, если вы укажете.