簡體   English   中英

執行SQL查詢以排序列表,而不必將其存儲為Java對象?

[英]Executing an SQL query to order a list without having to store it as a java object?

我在MySQL中有一個包含3列的表:CategoryID,Score,dateTime。 我需要找到得分最高的前4個類別。 我還必須考慮每個分數的時間戳,因為如果我在較舊的日期在某個類別中得分較高,而在最近的某個日期中該類別得分較低,則最近的分數將主導該類別的分數。 SQL中是否存在查詢以生成結果集? 我在Java中通過將數據存儲為對象來完成此操作,但是如果有一種更有效的方法,我更願意這樣做。

注意:pickRandom是字符串的ArrayList,並且忽略方法checkIfThere()

Scores prevScore = new Scores(0, "AD",  new Timestamp(0));
            while (rs.next()) {

                categoryID = rs.getString("categoryID");
                int relScore = rs.getInt("relevanceScore");
                Timestamp ts = rs.getTimestamp("date_time");

                Scores currScore = new Scores(relScore, categoryID, ts);

                // ensures that a Random Barrier Cateogry is prompted
                if ((currScore.getScore() >= prevScore.getScore() && (currScore.getDate().compareTo(prevScore.getDate()) > 0) && !checkIfThere(user, categoryID))) {
                    pickRandom.add(categoryID);
                    prevScore = currScore;
                }
            }

編輯:

表: 分數

'AD', '110', '2015-08-26 14:59:51' 
'DC', '110', '2015-08-26 14:59:51' 
'DO', '110', '2015-08-26 14:59:51' 
'EC', '8.087601288990395', '2015-08-26 14:59:53' 
'EC', '110', '2015-08-26 14:59:51'

嘗試以下操作。 inr派生表依靠唯一的時間/秒時間分段。 也許可以使用id列進行增強。 inr將在我的樣本數據中獲得所有6個類別。 外部將加入並說只需要4。

create table scores
(   id int auto_increment primary key,
    categoryID varchar(10) not null,
    relevanceScore float not null,
    date_time datetime not null
);
truncate table scores;
insert scores (categoryID,relevanceScore,date_time) values
('AD', '110', '2015-08-26 14:59:51'), 
('DC', '110', '2015-08-26 14:59:51'), 
('DO', '110', '2015-08-26 14:59:51'), 
('EC', '8.087601288990395', '2015-08-26 14:59:53'), 
('EC', '110', '2015-08-26 14:59:51'),
('OLD1', '110', '2014-08-26 14:59:51'),
('OLD2', '110', '2014-08-26 14:59:51');

選項A :(按date_time DESC排在前4位)

select s.* from scores s 
join 
( select categoryID,max(date_time) as maxdt 
  from scores 
  group by categoryId 
) inr 
on inr.categoryID=s.categoryID and inr.maxdt=s.date_time 
order by s.date_time desc 
limit 4; 

+----+------------+----------------+---------------------+
| id | categoryID | relevanceScore | date_time           |
+----+------------+----------------+---------------------+
|  4 | EC         |         8.0876 | 2015-08-26 14:59:53 |
|  1 | AD         |            110 | 2015-08-26 14:59:51 |
|  2 | DC         |            110 | 2015-08-26 14:59:51 |
|  3 | DO         |            110 | 2015-08-26 14:59:51 |
+----+------------+----------------+---------------------+
4 rows in set (0.00 sec)

選項B:(relevanceScore DESC排名前4)

select s.* from scores s 
join 
( select categoryID,max(date_time) as maxdt 
  from scores 
  group by categoryId 
) inr 
on inr.categoryID=s.categoryID and inr.maxdt=s.date_time 
order by s.relevanceScore desc
limit 4; 
+----+------------+----------------+---------------------+
| id | categoryID | relevanceScore | date_time           |
+----+------------+----------------+---------------------+
|  1 | AD         |            110 | 2015-08-26 14:59:51 |
|  2 | DC         |            110 | 2015-08-26 14:59:51 |
|  3 | DO         |            110 | 2015-08-26 14:59:51 |
|  6 | OLD1       |            110 | 2014-08-26 14:59:51 |
+----+------------+----------------+---------------------+
4 rows in set (0.00 sec)

嘗試這個


select * from Scores order by date_time,relevanceScore;

如何存儲列表<object>在房間數據庫中? (我在使用 DAO 查詢檢索列表時遇到問題)<div id="text_translate"><p> 我將 Device 對象存儲在 Room 數據庫中,並且在檢索作為浮點列表的屬性 (temp_values) 之一時遇到問題。 我已經按照此處找到的其他建議說您需要一個類型轉換器,所以我在這里展示了。 當我嘗試編譯時,出現此錯誤:</p><blockquote><p> “警告:查詢返回 java.lang.Float 未使用的某些列 [temp_values]。您可以在字段上使用 @ColumnInfo 注釋來指定映射。您可以通過使用 @SuppressWarnings(RoomWarnings .CURSOR_MISMATCH)。查詢返回的列:temp_values。java.lang.Float 中的字段:。"</p></blockquote><p> 問題在於 DAO 中的 getTempValues 查詢,如果我將其注釋掉,那么一切都編譯得很好。 我在下面包含了設備 object、TemperatureListConverter 和我的 DAO。</p><pre> @Entity(tableName = "devices") @TypeConverters(TemperatureListConverter.class) public class Device implements Serializable { @PrimaryKey @NonNull @ColumnInfo(name = "serial_num") private String serialNum; @ColumnInfo(name = "temp_values") @TypeConverters(TemperatureListConverter.class) private List&lt;Float&gt; tempValues; public Device(String serialNum) { this.serialNum = serialNum; this.tempValues = new ArrayList&lt;&gt;(); } public String getSerialNum() { return serialNum; } public List&lt;Float&gt; getTempValues() { return tempValues; } public void setTempValues(List&lt;Float&gt; tempValues) { this.tempValues = tempValues; } }</pre><pre> public class TemperatureListConverter { private static final Gson gson = new Gson(); @TypeConverter public static List&lt;Float&gt; toTempList(String tempValuesString) { if (tempValuesString == null) { return Collections.emptyList(); } Type type = new TypeToken&lt;List&lt;Float&gt;&gt;() {}.getType(); return gson.fromJson(tempValuesString, type); } @TypeConverter public static String fromTempList(List&lt;Float&gt; tempValues) { return gson.toJson(tempValues); } }</pre><pre> @Dao @TypeConverters(TemperatureListConverter.class) public interface DeviceDao { @Query("SELECT * FROM devices") List&lt;Device&gt; getAllDevices(); @Query("SELECT * FROM devices WHERE serial_num =:serialNum") Device getDevice(String serialNum); @Query("SELECT temp_values FROM devices WHERE serial_num =:serialNum") List&lt;Float&gt; getTempValues(String serialNum); @Query("UPDATE devices SET temp_values =:tempValues WHERE serial_num =:serialNum") int setTempValues(String serialNum, List&lt;Float&gt; tempValues); @Insert void insert(Device... device); @Query("DELETE FROM devices WHERE serial_num =:serialNum") void deleteBySerial(String serialNum); }</pre><p> 編輯:我在這里添加了我的數據庫 class 。</p><pre> @Database(entities = {Device.class}, version = 37, exportSchema = false) @TypeConverters(TemperatureListConverter.class) public abstract class DeviceDatabase extends RoomDatabase { private static final String DB_NAME = "devices_db"; private static DeviceDatabase deviceDb; // simple singleton public static DeviceDatabase getDeviceDb(Context context) { if (deviceDb == null) { deviceDb = Room.databaseBuilder(context, DeviceDatabase.class, DB_NAME).fallbackToDestructiveMigration().build(); } return deviceDb; } public abstract DeviceDao getDeviceDao(); public void addDevice(final Device device) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().insert(device); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public void removeDevice(final String serialNum) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().deleteBySerial(serialNum); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public Device getDevice(final String serialNum) { final Device[] finalDevice = new Device[1]; Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalDevice[0] = getDeviceDao().getDevice(serialNum); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalDevice[0]; } public List&lt;Float&gt; getTempValues(final String serialNum) { final List&lt;Float&gt; finalTempValues = new ArrayList&lt;&gt;(); Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalTempValues.addAll(getDeviceDao().getTempValues(serialNum)); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalTempValues; } public void setTempValues(final String serialNum, final List&lt;Float&gt; tempValues) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().setTempValues(serialNum, tempValues); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }</pre></div></object>

[英]How to store List<Object> in Room database? (I'm having trouble retrieving the list with DAO query)

訂單<object>以列表的順序<long> java<div id="text_translate"><p> 在閱讀了幾個問題和示例后,我提出了這個示例,我對其進行了一些修改以使其按預期工作。</p><pre> Collections.sort(listToOrder, Comparator.comparing(item -&gt; someObject.getListOfLongs().indexOf(item.getId())));</pre><p> 所以 listToOrder 是一個 MyObject 的列表,它有名稱和 id,所以我需要按照與 listOfLongs 相同的順序訂購 listToOrder。</p><p> 通過給出的代碼示例,它可以按預期工作,但是如果 listToOrder 的大小不同,它會失敗,想知道即使大小不同,我該如何讓它工作。</p><p> 編輯:我誤讀了,我得到的錯誤是 IndexOutOfBoundsException 不是由我放在那里的代碼行觸發的,這是因為手動日志。</p></div></long></object>

[英]order List<Object> with the order of List<Long> java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 無法在Java中執行SQL查詢 無法在Java應用程序中執行SQL查詢 如何存儲列表<object>在房間數據庫中? (我在使用 DAO 查詢檢索列表時遇到問題)<div id="text_translate"><p> 我將 Device 對象存儲在 Room 數據庫中,並且在檢索作為浮點列表的屬性 (temp_values) 之一時遇到問題。 我已經按照此處找到的其他建議說您需要一個類型轉換器,所以我在這里展示了。 當我嘗試編譯時,出現此錯誤:</p><blockquote><p> “警告:查詢返回 java.lang.Float 未使用的某些列 [temp_values]。您可以在字段上使用 @ColumnInfo 注釋來指定映射。您可以通過使用 @SuppressWarnings(RoomWarnings .CURSOR_MISMATCH)。查詢返回的列:temp_values。java.lang.Float 中的字段:。"</p></blockquote><p> 問題在於 DAO 中的 getTempValues 查詢,如果我將其注釋掉,那么一切都編譯得很好。 我在下面包含了設備 object、TemperatureListConverter 和我的 DAO。</p><pre> @Entity(tableName = "devices") @TypeConverters(TemperatureListConverter.class) public class Device implements Serializable { @PrimaryKey @NonNull @ColumnInfo(name = "serial_num") private String serialNum; @ColumnInfo(name = "temp_values") @TypeConverters(TemperatureListConverter.class) private List&lt;Float&gt; tempValues; public Device(String serialNum) { this.serialNum = serialNum; this.tempValues = new ArrayList&lt;&gt;(); } public String getSerialNum() { return serialNum; } public List&lt;Float&gt; getTempValues() { return tempValues; } public void setTempValues(List&lt;Float&gt; tempValues) { this.tempValues = tempValues; } }</pre><pre> public class TemperatureListConverter { private static final Gson gson = new Gson(); @TypeConverter public static List&lt;Float&gt; toTempList(String tempValuesString) { if (tempValuesString == null) { return Collections.emptyList(); } Type type = new TypeToken&lt;List&lt;Float&gt;&gt;() {}.getType(); return gson.fromJson(tempValuesString, type); } @TypeConverter public static String fromTempList(List&lt;Float&gt; tempValues) { return gson.toJson(tempValues); } }</pre><pre> @Dao @TypeConverters(TemperatureListConverter.class) public interface DeviceDao { @Query("SELECT * FROM devices") List&lt;Device&gt; getAllDevices(); @Query("SELECT * FROM devices WHERE serial_num =:serialNum") Device getDevice(String serialNum); @Query("SELECT temp_values FROM devices WHERE serial_num =:serialNum") List&lt;Float&gt; getTempValues(String serialNum); @Query("UPDATE devices SET temp_values =:tempValues WHERE serial_num =:serialNum") int setTempValues(String serialNum, List&lt;Float&gt; tempValues); @Insert void insert(Device... device); @Query("DELETE FROM devices WHERE serial_num =:serialNum") void deleteBySerial(String serialNum); }</pre><p> 編輯:我在這里添加了我的數據庫 class 。</p><pre> @Database(entities = {Device.class}, version = 37, exportSchema = false) @TypeConverters(TemperatureListConverter.class) public abstract class DeviceDatabase extends RoomDatabase { private static final String DB_NAME = "devices_db"; private static DeviceDatabase deviceDb; // simple singleton public static DeviceDatabase getDeviceDb(Context context) { if (deviceDb == null) { deviceDb = Room.databaseBuilder(context, DeviceDatabase.class, DB_NAME).fallbackToDestructiveMigration().build(); } return deviceDb; } public abstract DeviceDao getDeviceDao(); public void addDevice(final Device device) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().insert(device); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public void removeDevice(final String serialNum) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().deleteBySerial(serialNum); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public Device getDevice(final String serialNum) { final Device[] finalDevice = new Device[1]; Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalDevice[0] = getDeviceDao().getDevice(serialNum); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalDevice[0]; } public List&lt;Float&gt; getTempValues(final String serialNum) { final List&lt;Float&gt; finalTempValues = new ArrayList&lt;&gt;(); Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalTempValues.addAll(getDeviceDao().getTempValues(serialNum)); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalTempValues; } public void setTempValues(final String serialNum, final List&lt;Float&gt; tempValues) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().setTempValues(serialNum, tempValues); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }</pre></div></object> 訂單<object>以列表的順序<long> java<div id="text_translate"><p> 在閱讀了幾個問題和示例后,我提出了這個示例,我對其進行了一些修改以使其按預期工作。</p><pre> Collections.sort(listToOrder, Comparator.comparing(item -&gt; someObject.getListOfLongs().indexOf(item.getId())));</pre><p> 所以 listToOrder 是一個 MyObject 的列表,它有名稱和 id,所以我需要按照與 listOfLongs 相同的順序訂購 listToOrder。</p><p> 通過給出的代碼示例,它可以按預期工作,但是如果 listToOrder 的大小不同,它會失敗,想知道即使大小不同,我該如何讓它工作。</p><p> 編輯:我誤讀了,我得到的錯誤是 IndexOutOfBoundsException 不是由我放在那里的代碼行觸發的,這是因為手動日志。</p></div></long></object> 在不選擇java中的數據庫的情況下執行Mysql查詢 Java將SQL請求存儲在對象中 在 Java 中執行 SQL 查詢時沒有輸出 無法通過Java在Netbeans上執行SQL查詢 如何在沒有getKey方法的情況下從java中的對象列表創建地圖列表? 更新:從Java執行SQL查詢時出現問題
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM