Прежде всего мое приложение работает на локальном сервере, пока оно не работает, когда я отталкивал его на производственный сервер !!!GAE, «не найдено ни одного совпадающего индекса» в результате запроса
Я провел 2 часа и нашел что-то с моим классом Entity, но проблема не нашла. Я также предполагаю, что мой запрос имеет проблемы. Таким образом, это моя сущность класс:
@Entity(name = "UserAppsJPA")
public class UserAppsJPA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String packageName;
private String userUUID;
private String appName;
private long appCounter;
private long appUsage;
private long installDate;
private long uninstallDate;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserAppsJPA that = (UserAppsJPA) o;
if (!packageName.equals(that.packageName)) return false;
if (!userUUID.equals(that.userUUID)) return false;
return true;
}
@Override
public int hashCode() {
int result = packageName.hashCode();
result = 31 * result + userUUID.hashCode();
return result;
}
@Override
public String toString() {
return "UserAppsJPA {" +
"id=" + id +
", packageName='" + packageName + '\'' +
", userUUID='" + userUUID + '\'' +
", appName='" + appName + '\'' +
", appCounter=" + appCounter +
", appUsage=" + appUsage +
", installDate=" + installDate +
", uninstallDate=" + uninstallDate +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
// other setters and getters methods
}
Compose из packageName
и userUUID
достаточно для создания секретного ключа, однако я нашел, что это трудно для меня (как я супер младший в GAE). Вот почему я добавил id
поле в этом классе.
Я определил следующую строку в моей строке запроса в классе сервлета:
private static final String QUERY_USER_APPS = "SELECT m FROM UserAppsJPA m WHERE m.packageName = :keywordPkg AND m.userUUID = :keywordUUID ORDER BY m.appName ASC";
и, наконец, мой метод:
private void updateUserTable(List<UserAppsJPA> userAppsJPAList) {
EntityManager em = EMF.get().createEntityManager();
try {
for (int i=0; i<userAppsJPAList.size(); i++) {
System.out.println("=> " + i + " - " + userAppsJPAList.get(i).toString());
Query q = em.createQuery(QUERY_USER_APPS)
.setParameter("keywordPkg", userAppsJPAList.get(i).getPackageName())
.setParameter("keywordUUID", userAppsJPAList.get(i).getUserUUID());
@SuppressWarnings("unchecked")
List<UserAppsJPA> list = (List<UserAppsJPA>) q.getResultList(); // <= I guess problem is here
if(list == null)
System.out.println("list is null");
else
System.out.println("3-1, size: " + list.size());
if(list != null && list.size()>0) {
UserAppsJPA record = list.get(0);
userAppsJPAList.get(i).setId(record.getId());
}
System.out.println("@@@");
em.getTransaction().begin();
em.persist(userAppsJPAList.get(i));
em.getTransaction().commit();
}
} catch (Exception e) {
System.out.println("Error => " + e.getMessage());
} finally {
em.close();
}
}
Как я уже упоминал выше код работает на локальной машине, в то время как не работа на производственном сервере. Это log:
2014-02-20 17:12:03.509
[s~twitterjaya-eyeballs/1.373900386032203857].<stdout>: => 0 - UserAppsJPA {id=null, packageName='com.twitterjaya.eyeball', userUUID='00000000-74f7-8968-ffff-fffff607c160', appName='Eyeball', appCounter=17, appUsage=3060000, installDate=1392879894412, uninstallDate=0}
I 2014-02-20 17:12:03.518
[s~twitterjaya-eyeballs/1.373900386032203857].<stdout>: Error => no matching index found.
The suggested index for this query is:
<datastore-index kind="UserAppsJPA" ancestor="false" source="manual">
<property name="packageName" direction="asc"/>
<property name="userUUID" direction="asc"/>
<property name="appName" direction="asc"/>
</datastore-index>
Я предполагаю, что моя сущность не должна иметь проблемы, потому что она похожа на мою другую сущность, которая работает. Поэтому я подозрительно запрашиваю строку.
Любое предложение будет оценено. Благодарю.
Вам нужно добавить этот индекс и загрузить его в производство, как говорится в ошибке. –
Спасибо, Тим, не могли бы вы дать мне более подробную информацию. спасибо – Hesam
Что вам нужно добавить, указано в ошибке. Как вы добавляете это, так и развертывание потребует, чтобы вы читали документы. Я не делаю java на appengine. –