2014-02-20 5 views
1

Прежде всего мое приложение работает на локальном сервере, пока оно не работает, когда я отталкивал его на производственный сервер !!!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> 

Я предполагаю, что моя сущность не должна иметь проблемы, потому что она похожа на мою другую сущность, которая работает. Поэтому я подозрительно запрашиваю строку.

Любое предложение будет оценено. Благодарю.

+2

Вам нужно добавить этот индекс и загрузить его в производство, как говорится в ошибке. –

+0

Спасибо, Тим, не могли бы вы дать мне более подробную информацию. спасибо – Hesam

+0

Что вам нужно добавить, указано в ошибке. Как вы добавляете это, так и развертывание потребует, чтобы вы читали документы. Я не делаю java на appengine. –

ответ

1

Если вы используете IntelliJ IDEA следующие инструкции:

  1. Перейдите к вам PROJECT-каталог/из/артефакты/
  2. Открыть datastore-indexes-auto.xml в редактор (перетащить & падение его в IntelliJ IDEA, например)
  3. Добавить ваши индексы
  4. Перестроить свой проект и толкать его на сервер
  5. Перейти к вашей control panel, а затем Datastore Indexes, вы видите, что ваши индексы находятся под зданием. Подождите 1-2 минуты и обновите страницу. Когда он изменился Serving ваш API готов

Mine здесь:

<datastore-indexes> 

    <!-- *** This one generated wrong by GAE that's why you should do it manually *** 
    <datastore-index kind="UserAppsJPA" ancestor="false" source="auto"> 
     <property name="userUUID" direction="asc"/> 
     <property name="appCounter" direction="desc"/> 
    </datastore-index> --> 

    <datastore-index kind="UserAppsJPA" ancestor="false" source="manual"> 
     <property name="packageName" direction="asc"/> 
     <property name="userUUID" direction="asc"/> 
    </datastore-index> 

</datastore-indexes> 

Read Index configuration для получения дополнительной информации.

Особая благодарность @Tim за его предложение.

Смежные вопросы