При использовании @Id
аннотация с полями непосредственно поддерживаемых типов не является единственным способом определить идентификационные данные объекта (см. @IdClass
приблизительно с @Id
аннотации или @EmbeddedId
с @Embedded
), спецификация JPA требует первичного ключа для каждого объекта.
Тем не менее Вам не нужны объекты для использования JPA с представлениями базы данных. Как отображающийся на представление не отличается от отображения до таблицы с точки зрения SQL, Вы могли все еще использовать собственные запросы (createNativeQuery
на EntityManager
) для получения скалярных величин вместо этого.
Из-за языковой разницы (сохраняются только объявления функций ниже, поскольку это только важно)
void execute( void (&func)() );
void g();
int main() {
void (*fp)() = g;
execute(fp); // doesn't work
execute(&g); // doesn't work either
execute(g); // works
}
Это не работает, потому что ему нужна функция, а не указатель на функцию. По той же причине, что ответ на массив отклоняет указатель, он также отклоняет указатель. Вы должны передать букву «g» напрямую.
Для шаблонов это тоже имеет значение
template<typename T>
void execute(T &t) { T u = t; u(); }
template<typename T>
void execute(T t) { T u = t; u(); }
Эти два очень сильно отличаются друг от друга. Если вы вызовете его с помощью execute (g);
, как указано выше, то первый попытается объявить функцию и инициализировать ее с помощью t
(ссылка на g
) . Сгенерированная функция будет выглядеть так
void execute(void(&t)()) { void u() = t; u(); }
Теперь вы можете инициализировать ссылки и указатели на функции, но, конечно, не сами функции. Во втором определении T
будет выведено в тип указателя функции путем вывода аргумента шаблона, и передача функции преобразует его в этот тип параметра указателя неявно. Так что все будет хорошо.
Я не знаю, почему MSVC по-разному обрабатывает их при встраивании, но я также подозреваю, что это потому, что ссылки на функции появляются реже.
Я думаю, что это связано со стандартом C ++ 4.3:
l-значение типа функции T может быть преобразовано в r-значение типа «указатель на T.» Результатом будет указатель на функция.
Это не такая распространенная идиома, так что, возможно, команда VS не добавила правила для ее оптимизации.
Разница между ссылкой (&) и указателем (*) заключается в том, что ссылка предоставляет адрес переменной или ее местоположение, а указатель указывает на местоположение в памяти сохраненного адреса. в нем.
int *pointer;
int variable;
pointer = &variable; // assigning the address of variable to pointer
variable = 53; // value of variable
cout << *pointer; // This should output the value of the address where is pointing, in this
// case 53, that is the value of variable to where is pointing.
Мы можем заключить, что (& переменная) имеет адрес этой ячейки памяти, а * anyname указывает на адрес, хранящийся в ее памяти ...